首页 > 代码库 > java基础知识(六)日期处理

java基础知识(六)日期处理

一、日期处理类

  在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃

1、Date

package com;


import java.util.Date;

/**
 * Created by Administrator on 2016/11/8.
 */
public class Test {

    public static void main(String arg[]){
                /**
         * Date 有两个构造方法
         * 1、用来获取当前系统时间
         * 2、分配 Date 对象并初始化此对象,以表示自从标准基准时间
         * (称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数
         */
        Date date = new Date();
        System.out.println(date);
        Date date1 = new Date(123l);
        Date date2 = new Date(123l);
        System.out.println(date1);

        /**
         * Date的方法,下面列出的是未过时的,获取年、月、日及格式化方法已废弃,将由Calendar类实现,以便于国际化
         */
        System.out.println("测试此日期是否在指定日期之后 : " + date.after(date1));
        System.out.println("测试此日期是否在指定日期之前 : " + date.before(date1));
        System.out.println("返回对象的副本 : " + date.clone());
        System.out.println("比较两个日期的顺序 : " + date.compareTo(date1));
        System.out.println("比较两个日期的相等性 : " + date1.equals(date2));//比较的是值
        System.out.println("返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数 : " + date.getTime());
        System.out.println("返回此对象的哈希码值 : " + date.hashCode());
        date.setTime(12345l);//设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点
        System.out.println("setTime设置后的date为 : " + date);
        System.out.println("把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat) : " + date.toString());
    }

}

  java有3中比较日期的方法

  • 使用 getTime() 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。
  • 使用方法 before(),after() 和 equals()。例如,一个月的12号比18号早,则 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
  • 使用 compareTo() 方法,它是由 Comparable 接口定义的,Date 类实现了这个接口。

2、SimpleDateFormat

  SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

public class Test {
    public static void main(String arg[]) {
        /**
         *SimpleDateFormat构造方法,有4个,下面介绍常用的两个
         * 1.用默认的模式和默认语言环境的日期格式符号构造
         * 2 用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat
         */
        Date date01 = new Date();
        SimpleDateFormat sdf01 = new SimpleDateFormat();
        System.out.println(sdf01.format(date01));
        SimpleDateFormat sdf02 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
        System.out.println(sdf02.format(date01) + "\n");

        /**
         * SimpleDateFormat方法
         */
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
        String str = sdf.format(date);
        System.out.println(str);
        try {
            sdf.applyLocalizedPattern("E");
            System.out.println("将给定的本地化模式字符串应用于此日期格式 : " + sdf.format(date));
        }catch (Exception e) {
            System.out.println("input format error, error information : " + e);
        }
        sdf.applyPattern("yyyy-MM-dd");
        System.out.println("将给定模式字符串应用于此日期格式 : " + sdf.format(date));
        SimpleDateFormat sdf1 = (SimpleDateFormat) sdf.clone();
        System.out.println("创建此 SimpleDateFormat 的一个副本 : " + sdf.clone());
        System.out.println("比较给定对象与此 SimpleDateFormat 的相等性 : " + sdf.equals(sdf1));
        StringBuffer sb = new StringBuffer("当前时间是[");
        System.out.println("将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer : " + sdf.format(date, sb, new FieldPosition(1)) + "]");
        System.out.println("格式化生成 AttributedCharacterIterator 的对象 : " + sdf.formatToCharacterIterator(date).getAllAttributeKeys());
        System.out.println("返回在 100 年周期内被解释的两位数字年份的开始日期 : " + sdf.get2DigitYearStart());
        System.out.println("解析字符串的文本,生成 Date : " + sdf.parse(str, new ParsePosition(1)));
        System.out.println("返回描述此日期格式的本地化模式字符串 : " + sdf.toLocalizedPattern());
        System.out.println("返回描述此日期格式的模式字符串 : " + sdf.toPattern());
    }

}

时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:

 

字母描述示例
G 纪元标记 AD
y 四位年份 2001
M 月份 July or 07
d 一个月的日期 10
h  A.M./P.M. (1~12)格式小时 12
H 一天中的小时 (0~23) 22
m 分钟数 30
s 秒数 55
S 毫秒数 234
E 星期几 Tuesday
D 一年中的日子 360
F 一个月中第几周的周几 2 (second Wed. in July)
w 一年中第几周 40
W 一个月中第几周 1
a A.M./P.M. 标记 PM
k 一天中的小时(1~24) 24
K  A.M./P.M. (0~11)格式小时 10
z 时区 Eastern Standard Time
文字定界符 Delimiter
" 单引号 `

        Date date01 = new Date();
        SimpleDateFormat sdf01 = new SimpleDateFormat();
        sdf01.applyLocalizedPattern("E");
        System.out.println("星期几 : " + sdf01.format(date01));
        sdf01.applyLocalizedPattern("D");
        System.out.println("一年中的日子 : " + sdf01.format(date01));

3、Calendar

  Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

public class Test1 {
    public static void main(String arg[]) {
        /**
         * Calendar字段
         */
        Calendar c1 = Calendar.getInstance();
        System.out.println(c1.getTime() + "\n");

        System.out.println("指示年的 get 和 set 的字段数字 : " + c1.get(Calendar.YEAR));
        System.out.println("指示月份的 get 和 set 的字段数字 : " + c1.get(Calendar.MONTH));
        System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DATE));
        System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
        System.out.println("get 和 set 的字段数字,指示一小时中的分钟 : " + c1.get(Calendar.MINUTE));
        System.out.println("get 和 set 的字段数字,指示一分钟中的秒 : " + c1.get(Calendar.SECOND) + "\n");

        System.out.println("get 和 set 的字段数字,指示当前年中的星期数 : " + c1.get(Calendar.WEEK_OF_YEAR));
        System.out.println("get 和 set 的字段数字,指示当前月中的星期数 : " + c1.get(Calendar.WEEK_OF_MONTH) + "\n");

        System.out.println("get 和 set 的字段数字,指示当前年中的天数 : " + c1.get(Calendar.DAY_OF_YEAR));
        System.out.println("get 和 set 的字段数字,指示一个月中的某天 : " + c1.get(Calendar.DAY_OF_MONTH));
        System.out.println("get 和 set 的字段数字,指示一个星期中的某天 : " + c1.get(Calendar.DAY_OF_WEEK) + "\n");

        System.out.println("get 和 set 的字段数字,指示上午或下午的小时 : " + c1.get(Calendar.HOUR));
        System.out.println("get 和 set 的字段数字,指示一天中的小时 : " + c1.get(Calendar.HOUR_OF_DAY) + "\n");


        /**
         * Calendar方法
         */
        c1.add(Calendar.YEAR, 1);
        System.out.println("根据日历的规则,为给定的日历字段添加或减去指定的时间量 : " + c1.getTime());
        Calendar c2 = Calendar.getInstance();
        System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果 : " + c1.after(c2));
        System.out.println("判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果 : " + c1.before(c2));
        //c2.clear();
        //System.out.println("将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
        //c2.clear(Calendar.YEAR);
        //System.out.println("将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义 : " + c2.getTime());
        System.out.println("比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量) : " + c1.compareTo(c2));
        System.out.println("返回给定日历字段的值 : " + c2.get(Calendar.YEAR));
        System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值 : " + c2.getActualMaximum(Calendar.YEAR));
        System.out.println("给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值 : " + c2.getActualMinimum(Calendar.YEAR));
        System.out.println("获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY : " + c2.getFirstDayOfWeek());

        System.out.println("返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象 : " + c2.getTime());
        System.out.println("返回此 Calendar 的时间值,以毫秒为单位 : " + c2.getTimeInMillis());
        System.out.println("获得时区 : " + c2.getTimeZone().getDisplayName());
        c2.roll(Calendar.DATE, 1);
        System.out.println("向指定日历字段添加指定(有符号的)时间量,不更改更大的字段 : " + c2.getTime());
        c2.set(Calendar.YEAR, 2002);
        System.out.println("将给定的日历字段设置为给定值 : " + c2.getTime());
        c2.set(1997, 7, 1, 0, 0);
        System.out.println(" 设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值 : " + c2.getTime());
        c2.set(1997, 7, 1, 0, 0, 0);
        System.out.println("设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值 : " + c2.getTime());
        c2.setTime(new Date());
        System.out.println("使用给定的 Date 设置此 Calendar 的时间 : " + c2.getTime());
    }

}

 二、常用的日期处理方法

public class DateUtil {

    public final static String FORMAT_19 = "yyyy-MM-dd hh:mm:ss";
    public final static String FORMAT_10 = "yyyy-MM-dd";
    public final static String FORMAT_CN_19 = "yyyy年MM月dd日 hh时mm分ss秒";
    public final static String FORMAT_CN_10 = "yyyy年MM月dd日";

    /**
     * 日期转为指定格式
     */
    public static String parsDateToString(Date date, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * 字符串转换为日期
     */
    public static Date parsStringToDate(String formatDate, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = null;
        try {
            date = sdf.parse(formatDate);
        } catch (ParseException e) {
            System.out.println("输入日期格式不正确,异常信息:" + e);
        }
        return date;
    }

    /**
     * 获得指定日期的前num个月的日期
     */
    public static Date beforeMonth(Date date, int num) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.MONTH, num * -1);
        Date dBefore = calendar.getTime();
        return dBefore;
    }

    private static Calendar dateToCalendar(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 日期为所在月的第几周
     */
    public static int weekOfMonth(Date date) {
        return dateToCalendar(date).get(Calendar.WEEK_OF_MONTH);
    }

    /**
     * 日期为所在年的第几周
     */
    public static int weekOfYear(Date date) {
        return dateToCalendar(date).get(Calendar.WEEK_OF_YEAR);
    }

    /**
     * 日期为所在年的第几天
     */
    public static int dayOfYear(Date date) {
        return dateToCalendar(date).get(Calendar.DAY_OF_YEAR);
    }

    /**
     * 根据一个时间获取该时间为星期几
     */
    public static String dayOfWeek(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        return sdf.format(date);
    }

    /**
     * 计算两个时间之间的天数
     */
    public static int countDaysBetween(Date d1, Date d2) {
        Calendar c1 = dateToCalendar(d1);
        Calendar c2 = dateToCalendar(d2);
        return Math.abs(Math.abs(c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 365 + (c1.get(Calendar.DAY_OF_YEAR) - c2.get(Calendar.DAY_OF_YEAR)));
    }

    public static void main(String[] args) {
        String formatDate = DateUtil.parsDateToString(new Date(), DateUtil.FORMAT_CN_19);
        System.out.println("日期转为指定格式 : " + formatDate);
        System.out.println("字符串转换为日期 : " + parsStringToDate(formatDate, DateUtil.FORMAT_CN_19));
        System.out.println("获得指定日期的前num个月的日期 : " + beforeMonth(new Date(), 3));
        System.out.println("日期为所在月的第几周 : " + weekOfMonth(new Date()));
        System.out.println("日期为所在年的第几周 : " + weekOfYear(new Date()));
        System.out.println("日期为所在年的第几天 : " + dayOfYear(new Date()));
        System.out.println("日期是星期几 : " + dayOfWeek(new Date()));
        Calendar c = Calendar.getInstance();
        c.set(2017, 10, 25);
        System.out.println("计算两个时间之间的天数 : " + countDaysBetween(new Date(), c.getTime()));

    }
}

 

java基础知识(六)日期处理