当下,Java 程序中用来表现时间日期的方法有许多,例如 Calendar 类、Apache 下的 DateUtils 工具类、JDK1.8 新增一些关于时间日期的方法或者 Java 工具类库 HuTool。下面我将为大家一一介绍以上几种方法。

    一、Calendar

    (1)、Calender介绍

    Calendar的中文翻译是日历,实际上,在历史上有着许多种计时的方法。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是”Gregorian Calendar”。也就是我们在讲述年份时常用”公元**年”。Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。Calendar.getInstance()中所获得的实例就是一个”GreogrianCalendar”对象。

    (2)、简单的日期使用

    Calendar cal = Calendar.getInstance();
    System.out.println(cal.get(Calendar.DATE));//-----------------------今天是几号
    System.out.println(cal.get(Calendar.DAY_OF_MONTH));//---------------今天是一月的第几天
    System.out.println(cal.get(Calendar.DAY_OF_WEEK));//----------------从星期天开始计算,如果今天星期二,那么返回3
    System.out.println( cal.get(Calendar.DAY_OF_YEAR));//----------------今天是一年的第几天
    System.out.println( cal.get(Calendar.HOUR));//-----------------------现在是几点     12小时制
    System.out.println( cal.get(Calendar.HOUR_OF_DAY));//----------------现在是几点     24小时制,一般使用这个属性赋值
    System.out.println(cal.get(Calendar.MILLISECOND));//----------------现在的毫秒
    System.out.println( cal.get(Calendar.MINUTE));//---------------------现在是几分
    System.out.println( cal.get(Calendar.SECOND));//---------------------现在是几秒
    System.out.println(cal.get(Calendar.WEEK_OF_MONTH));//--------------现在是一个月中的第几周
    System.out.println(cal.get(Calendar.WEEK_OF_YEAR));//----------------现在是一个年中的第几周
    System.out.println(cal.get(Calendar.MONTH));//-----------------------月份获取需要 +1,那么,赋值时需要 -1
    
    System.out.println(cal.get(Calendar.MONTH)-1);     //即可获得上个月的月份
    

    (3)、与Date之间的转换

    Calendar calendar = Calendar.getInstance();
    // 从一个Calendar 对象中获取 Date 对象
    
    Date date = calendar.getTime();
    
    // 将 Date 对象反应到一个 Calendar 对象中,
    // 先获得一个实例,然后设置 Date 对象
    calendar.setTime(date);
    
    月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。
    calendar.set(Calendar.MONTH, 7);
    
    计算2000-01-01是星期几
    
    calendar.set(2000,1,1)
    
    calendar.get(calendar.DAY_OF_WEEK )
    

    当然Calender是最早的时间处理,是jdk1.6的东西难免比较过时

    二、Apache下的DateUtils

    (1)、引入包

    <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons-lang3</artifactId>
           <version>3.9</version>
    </dependency>
    

    (2)、没什么可说的上翻译就行

        /**
         * 以秒为标准时间的毫秒数
         */
        public static final long MILLIS_PER_SECOND = 1000
        /**
         *以分钟为标准时间的毫秒数
         */
        public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND
        /**
         *以小时为标准时间的毫秒数
         */
        public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE
        /**
         * 以天为标准时间的毫秒数
         */
        public static final long MILLIS_PER_DAY = 24 * MILLIS_PER_HOUR
        /**
         * 这个类型是半个月, 所以这可以代表日期是上还是下半个月 。
         */
        public static final int SEMI_MONTH = 1001
        /**
         * 周范围, 从星期日开始 。
         */
        public static final int RANGE_WEEK_SUNDAY = 1
        /**
         * 周范围,从星期一开始 。
         */
        public static final int RANGE_WEEK_MONDAY = 2
        /**
         * 周范围,从关注的那天开始。
         */
        public static final int RANGE_WEEK_RELATIVE = 3
        /**
         * 周范围,以关注的天为中心。
         */
        public static final int RANGE_WEEK_CENTER = 4
         /**
         * 月范围,从星期日开始 。
         */
        public static final int RANGE_MONTH_SUNDAY = 5
        /**
         * 月范围,从星期一开始 。
         */
        public static final int RANGE_MONTH_MONDAY = 6
         /**
         * 不应在标准编成构造获取实列, 而应该直接使用类中的静态方法,如:DateUtils.parseDate(str) 。
         * 此构造函数意在允许需要一个javabeen实列的工具中使用 。  
         */
        public DateUtils()
        /**
         * 判断两个日期时间是否是同一天 。
         *
         * @param date1  第一个日期,不可修改,非null
         * @param date2  第二个日期,不可修改,非null
         */
        public static boolean isSameDay(final Date date1, final Date date2)
        /**
         * 判断两个日历时间是否是同一天 。   
         *
         * @param cal1  第一个日历,不可修改,非null
         * @param cal2  第二个日历,不可修改,非null
         */
        public static boolean isSameDay(final Calendar cal1, final Calendar cal2)
        /**
         * 判断两个日期是否相同
         * 这种方法比较两个对象的毫秒时间 
         *
         * @param date1  第一个日期,不可修改,非null
         * @param date2  第二个日期,不可修改,非null
         */
        public static boolean isSameInstant(final Date date1, final Date date2)
        /**
         * 判断两个日历是否相同
         * 这种方法比较两个对象的毫秒时间 
         *
         * @param cal1  第一个日历,不可修改,非null
         * @param cal2  第二个日历,不可修改,非null
         */
        public static boolean isSameInstant(final Calendar cal1, final Calendar cal2)
        /**
         * 判断两个日历本地时间是否相同
         * 除了比较数值外两个日历对象的类型还要相同
         *
         * @param cal1  第一个日历,不可修改,非null
         * @param cal2  第二个日历,不可修改,非null
         */
        public static boolean isSameLocalTime(final Calendar cal1, final Calendar cal2)
        /**
         * 尝试用parsePatterns中各种不同的日期格式解析代表时间的字符串str 。
         * 
         * 解析时会逐个使用parsePatterns中的格式,如果都没有匹配上, 则抛出异常ParseException 。
         * 
         * @param str  被解析的时间字符串,非null
         * @param parsePatterns  用于解析str的时间格式,有一个或几个,非null
         */
        public static Date parseDate(final String str, final String... parsePatterns) throws ParseException
        /**
         * 尝试用parsePatterns中各种不同的日期格式解析代表时间的字符串str 。
         * 解析时会使用给定的日期格式符locale 。
         * 
         * 解析时会逐个使用parsePatterns中的格式,如果都没有匹配上, 则抛出异常ParseException 。
         * 
         * @param str  被解析的时间字符串,非null
         * @param locale 使用locale中的日期格式符,如果为null,则使用系统默认的locale
         * @param parsePatterns  用于解析str的时间格式,有一个或几个,非null
         */
        public static Date parseDate(final String str, final Locale locale, final String... parsePatterns) throws ParseException
        /**
         * 尝试用parsePatterns中各种不同的日期格式解析代表时间的字符串str 。
         *
         * 解析时会逐个使用parsePatterns中的格式,如果都没有匹配上, 则抛出异常ParseException 。
         * 解析器解析严格不允许的日期, 如:"February 942, 1996" 。
         * 
         * @param str  被解析的时间字符串,非null
         * @param parsePatterns  用于解析str的时间格式,有一个或几个,非null
         */
        public static Date parseDateStrictly(final String str, final String... parsePatterns) throws ParseException
        /**
         * 尝试用parsePatterns中各种不同的日期格式解析代表时间的字符串str 。
         * 解析时会使用给定的日期格式符locale 。
         *
         * 解析时会逐个使用parsePatterns中的格式,如果都没有匹配上, 则抛出异常ParseException 。
         * 解析器解析严格不允许的日期, 如:"February 942, 1996" 。
         * 
         * @param str  被解析的时间字符串,非null
         * @param locale 使用locale中的日期格式符,如果为null,则使用系统默认的locale
         * @param parsePatterns  用于解析str的时间格式,有一个或几个,非null
         */
        public static Date parseDateStrictly(final String str, final Locale locale, final String... parsePatterns) throws ParseException
        /**
         * 在日期date上增加amount年 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的年数,可能为负数
         */
        public static Date addYears(final Date date, final int amount)
        /**
         * 在日期date上增加amount月 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的月数,可能为负数
         */
        public static Date addMonths(final Date date, final int amount)
        /**
         * 在日期date上增加amount周 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的周数,可能为负数
         */
        public static Date addWeeks(final Date date, final int amount)
        /**
         * 在日期date上增加amount天 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的天数,可能为负数
         */
        public static Date addDays(final Date date, final int amount)
        /**
         * 在日期date上增加amount小时 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的小时数,可能为负数
         */
        public static Date addHours(final Date date, final int amount)
        /**
         * 在日期date上增加amount分钟 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的分钟数,可能为负数
         */
        public static Date addMinutes(final Date date, final int amount)
        /**
         * 在日期date上增加amount秒 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的秒数,可能为负数
         */
        public static Date addSeconds(final Date date, final int amount)
        /**
         * 在日期date上增加amount 毫秒 。
         *
         * @param date  处理的日期,非null
         * @param amount  要加的毫秒数,可能为负数
         */
        public static Date addMilliseconds(final Date date, final int amount)
         /**
         * 给日期data设置一个新的年份 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的年份
         */
        public static Date setYears(final Date date, final int amount)
         /**
         * 给日期data设置一个新的月份 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的月份
         */
        public static Date setMonths(final Date date, final int amount)
        /**
         * 给日期data设置一个新的天 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的天
         */
        public static Date setDays(final Date date, final int amount)
        /**
         * 给日期data设置一个新的小时 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的小时
         */
        public static Date setHours(final Date date, final int amount)
         /**
         * 给日期data设置一个新的分钟 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的分钟
         */
        public static Date setMinutes(final Date date, final int amount)
        /**
         * 给日期data设置一个新的秒 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的秒
         */
        public static Date setSeconds(final Date date, final int amount)
        /**
         * 给日期data设置一个新的毫秒 。
         *
         * @param date 处理的日期,非null
         * @param amount 要设置的毫秒
         */
        public static Date setMilliseconds(final Date date, final int amount)
        /**
         * 将一个日期放到日历中 。
         */
        public static Calendar toCalendar(final Date date)
        /**
         * 根据阈值field四舍五入日历date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 April 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Date round(final Date date, final int field)
        /**
         * 根据阈值field四舍五入日历date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 April 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值  
         */
        public static Calendar round(final Calendar date, final int field)
        /**
         * 根据阈值field四舍五入日历date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 April 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值 
         */
        public static Date round(final Object date, final int field)
        /**
         * 根据阈值field截取日期date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 13:00:00.000;
         * 如果field为MONTH,它将返回 1 Mar 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值 
         */
        public static Date truncate(final Date date, final int field)
         /**
         * 根据阈值field截取日历date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 13:00:00.000;
         * 如果field为MONTH,它将返回 1 Mar 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Calendar truncate(final Calendar date, final int field)
        /**
         * 根据阈值field截取日期date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 13:00:00.000;
         * 如果field为MONTH,它将返回 1 Mar 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Date truncate(final Object date, final int field)
        /**
         * 根据阈值field向上舍入日期date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 Apr 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Date ceiling(final Date date, final int field)
        /**
         * 根据阈值field向上舍入日期date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 Apr 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Calendar ceiling(final Calendar date, final int field)
        /**
         * 根据阈值field向上舍入日期date 。
         *
         * 例如, 如果你的时间是 28 Mar 2002 13:45:01.231,
         * 如果field为HOUR,它将返回 28 Mar 2002 14:00:00.000;
         * 如果field为MONTH,它将返回 1 Apr 2002 0:00:00.000 。
         * 
         * @param date  处理的日期,非null
         * @param field  阈值
         */
        public static Date ceiling(final Object date, final int field)
        /**
         * 根据指定的时间focus和范围类型rangeStyle构建一个时间范围迭代器 。
         *
         * 如传入的时间是Thursday, July 4, 2002,范围类型是RANGE_MONTH_SUNDAY,
         * 则返回迭代器的范围是从Sunday, June 30, 2002 到 Saturday, August 3, 2002
         *
         * @param focus  指定的时间
         * @param rangeStyle  范围类型,值必须是如下之一:
         * DateUtils.RANGE_MONTH_SUNDAY, 
         * DateUtils.RANGE_MONTH_MONDAY,
         * DateUtils.RANGE_WEEK_SUNDAY,
         * DateUtils.RANGE_WEEK_MONDAY,
         * DateUtils.RANGE_WEEK_RELATIVE,
         * DateUtils.RANGE_WEEK_CENTER
         */
        public static Iterator<Calendar> iterator(final Date focus, final int rangeStyle)
        /**
         * 根据指定的时间focus和范围类型rangeStyle构建一个时间范围迭代器 。
         *
         * 如传入的时间是Thursday, July 4, 2002,范围类型是RANGE_MONTH_SUNDAY,
         * 则返回迭代器的范围是从Sunday, June 30, 2002 到 Saturday, August 3, 2002
         *
         * @param focus  指定的时间
         * @param rangeStyle  范围类型,值必须是如下之一:
         * DateUtils.RANGE_MONTH_SUNDAY, 
         * DateUtils.RANGE_MONTH_MONDAY,
         * DateUtils.RANGE_WEEK_SUNDAY,
         * DateUtils.RANGE_WEEK_MONDAY,
         * DateUtils.RANGE_WEEK_RELATIVE,
         * DateUtils.RANGE_WEEK_CENTER
         */
        public static Iterator<Calendar> iterator(final Calendar focus, final int rangeStyle)
        /**
         * 根据指定的时间focus和范围类型rangeStyle构建一个时间范围迭代器 。
         *
         * 如传入的时间是Thursday, July 4, 2002,范围类型是RANGE_MONTH_SUNDAY,
         * 则返回迭代器的范围是从Sunday, June 30, 2002 到 Saturday, August 3, 2002
         *
         * @param focus  指定的时间
         * @param rangeStyle  范围类型,值必须是iterator(Calendar, int)方法注释中列出的
         */
        public static Iterator<?> iterator(final Object focus, final int rangeStyle)
     
    /**
         * 返回指定分段内的毫秒数 。 所有大于分段的DateFields将被忽略 。
         *
         * 请求任何日期毫秒,将返回当前秒的毫秒数 (返回一个数字在0和999之间) 。
         * 有效的分段值是: Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_YEAR、
         * Calendar.DATE、Calendar.HOUR_OF_DAY、Calendar.MINUTE、
         * Calendar.SECOND 和 Calendar.MILLISECOND
         * 分段值小于或等于MILLISECOND,将返回0 。
         * 
         *  January 1, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538
         *  January 6, 2008 7:15:10.538 with Calendar.SECOND as fragment will return 538
         *  January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10538
         *  January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
         *   (a millisecond cannot be split in milliseconds)
         * 
         * @param calendar 获取值得日历对象,非null
         * @param fragment 分段值
         */
      public static long getFragmentInMilliseconds(final Calendar calendar, final int fragment)
        /**
         * 返回指定分段内的秒数 。 所有大于分段的DateFields将被忽略 。
         *
         * 请求任何日期秒,将返回当前的分钟的秒数 (返回一个数字在0和59之间) 。
         * 有效的分段值是: Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_YEAR、
         * Calendar.DATE、Calendar.HOUR_OF_DAY、Calendar.MINUTE、
         * Calendar.SECOND 和 Calendar.MILLISECOND
         * 分段值小于或等于SECOND,将返回0 。
         * 
         *  January 1, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
         *  January 6, 2008 7:15:10.538 with Calendar.MINUTE as fragment will return 10
         *  January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 26110
         *   (7*3600 + 15*60 + 10)</li>
         *  January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
         * 
         * @param calendar 获取值得日历对象,非null
         * @param fragment 分段值
         */
        public static long getFragmentInSeconds(final Calendar calendar, final int fragment)
        /**
         * 返回指定分段内的分钟数 。 所有大于分段的DateFields将被忽略 。
         *
         * 请求任何日期分钟,将返回当前的小时的分钟数 (返回一个数字在0和59之间)
         * 有效的分段值是: Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_YEAR、
         * Calendar.DATE、Calendar.HOUR_OF_DAY、Calendar.MINUTE、
         * Calendar.SECOND 和 Calendar.MILLISECOND
         * 分段值小于或等于MINUTE,将返回0 。
         * 
         *  January 1, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
         *  January 6, 2008 7:15:10.538 with Calendar.HOUR_OF_DAY as fragment will return 15
         *  January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 15
         *  January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 435 (7*60 + 15)
         *  January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
         * 
         * @param calendar 获取值得日历对象,非null
         * @param fragment 分段值
         */
        public static long getFragmentInMinutes(final Calendar calendar, final int fragment)
        /**
         * 返回指定分段内的小时数 。 所有大于分段的DateFields将被忽略 。
         *
         * 请求任何日期小时,将返回当前的天的小时数 (返回一个数字在0和23之间) 。
         * 有效的分段值是: Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_YEAR、
         * Calendar.DATE、Calendar.HOUR_OF_DAY、Calendar.MINUTE、
         * Calendar.SECOND 和 Calendar.MILLISECOND
         * 分段值小于或等于HOUR_OF_DAY,将返回0 。
         *  
         *  January 1, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
         *  January 6, 2008 7:15:10.538 with Calendar.DAY_OF_YEAR as fragment will return 7
         *  January 1, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 7
         *  January 6, 2008 7:15:10.538 with Calendar.MONTH as fragment will return 127 (5*24 + 7)
         *  January 16, 2008 7:15:10.538 with Calendar.MILLISECOND as fragment will return 0
         *  
         * @param calendar 获取值得日历对象,非null
         * @param fragment 分段值
         */
        public static long getFragmentInHours(final Calendar calendar, final int fragment)
        /**
         * 返回指定分段内的天数 。 所有大于分段的DateFields将被忽略 。
         *
         * 请求任何日期天数,将返回当前的月的天数 (返回一个数字在1和31之间) 。
         * 有效的分段值是: Calendar.YEAR、Calendar.MONTH、Calendar.DAY_OF_YEAR、
         * Calendar.DATE、Calendar.HOUR_OF_DAY、Calendar.MINUTE、
         * Calendar.SECOND 和 Calendar.MILLISECOND
         * 分段值小于或等于DATE,将返回0 。
         * 
         *  January 28, 2008 with Calendar.MONTH as fragment will return 28
         *  February 28, 2008 with Calendar.MONTH as fragment will return 28
         *  January 28, 2008 with Calendar.YEAR as fragment will return 28
         *  February 28, 2008 with Calendar.YEAR as fragment will return 59
         *  January 28, 2008 with Calendar.MILLISECOND as fragment will return 0
         * 
         * @param calendar 获取值得日历对象,非null
         * @param fragment 分段值
         */
        public static long getFragmentInDays(final Calendar calendar, final int fragment)
        /**
         * 截取比较两个日历对象的field处的值是否相同 。
         * 
         * @param cal1 第一个日历对象,非null
         * @param cal2 第二个日历对象,非null
         * @param field Calendar中的阈值
         */
        public static boolean truncatedEquals(final Calendar cal1, final Calendar cal2, final int field)
        /**
         * 截取比较两个日期对象的field处的值是否相同 。
         * 
         * @param date1 第一个日期对象,非null
         * @param date2 第二个日期对象,非null
         * @param field Calendar中的阈值
         */
        public static boolean truncatedEquals(final Date date1, final Date date2, final int field)
        /**
         * 截取比较两个日历对象的field处的值 。
         * 如果第一个日历小于、等于、大于第二个,则对应返回负整数、0、正整数
         * 
         * @param cal1 第一个日历对象,非null
         * @param cal2 第二个日历对象,非null
         * @param field Calendar中的阈值
         */
        public static int truncatedCompareTo(final Calendar cal1, final Calendar cal2, final int field)
        /**
         * 截取比较断两个日期对象的field处的值 。
         * 如果第一个日期小于、等于、大于第二个,则对应返回负整数、0、正整数
         * 
         * @param date1 第一个日期对象,非null
         * @param date2 第二个日期对象,非null
         * @param field Calendar中的阈值
         */
        public static int truncatedCompareTo(final Date date1, final Date date2, final int field)
    	
    	
    	//简单举例
    	System.out.println(DateUtils.addDays(new Date(), 1));//-----------------当前日期。天数加1如果想建议填负数即可
        System.out.println(DateUtils.addHours(new Date(), 0));//----------------当前日期
        Date date = DateUtils.addDays(new Date(), 1);
    

    DateUtils返回的就是Date不需要转换,当然也是很早的东西了,只是诞生在Calender基础之上而已

    三、JDK1.8新增的日期API LocalDate | LocalTime | LocalDateTime

    新的日期API都是不可变的,更使用于多线程的使用环境中(从默认时区的系统时钟获取当前的日期时间。不用考虑时区差)
    优点:

    1、之前使用的java.util.Date月份从0开始,我们一般会+1使用,很不方便,java.time.LocalDate月份和星期都改成了enum

    2、java.util.Date和SimpleDateFormat都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。

    3、java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,更加明确需求取舍

    4、新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。

    (1)、LocalDateTime(年月日时分秒)

    LocalDateTime date = LocalDateTime.now();
            //2021-03-26T10:24:14.009784900
            System.out.println(date);
    
    		//获取年月日时分秒操作
            System.out.println(date.getYear());
            System.out.println(date.getMonthValue());
            System.out.println(date.getDayOfMonth());
            System.out.println(date.getHour());
            System.out.println(date.getMinute());
            System.out.println(date.getSecond());
            System.out.println(date.getNano());
    		
    		//当然你也可以获取最近任意的一段时间
    		 System.out.println(date.getSecond()+1);           ||        System.out.println(date.getSecond()-1);
    		
    
            // 手动创建一个LocalDateTime实例
            LocalDateTime date2 = LocalDateTime.of(2017, 12, 17, 9, 31, 31, 31);
            System.out.println(date2);
            // 进行加操作,得到新的日期实例
            LocalDateTime date3 = date2.plusDays(12);
            System.out.println(date3);
            // 进行减操作,得到新的日期实例
            LocalDateTime date4 = date3.minusYears(2);
            System.out.println(date4);
    		
    		isAfter()判断一个日期是否在指定日期之后  返回boolean 类型
    		System.out.println(localDateTime.isBefore(LocalDateTime.now()));//---------返回false
    		
    		isBefore()判断一个日期是否在指定日期之前   返回boolean 类型
    		System.out.println(localDateTime.isAfter(LocalDateTime.now()));//---------返回false
    	
    		isLeapYear()判断是否是闰年(这个是LocalDate类中的方法)  返回boolean类型
    		System.out.println(localDateTime.isEqual(LocalDateTime.now()));//---------返回true
    

    (2)、LocalDateTime与Date之间的转换

    Date to LocalDateTime

    Date todayDate = new Date();
    
    LocalDateTime ldt = Instant.ofEpochMilli( todayDate.getTime() )
            .atZone( ZoneId.systemDefault() )
            .toLocalDateTime();
    
    System.out.println(ldt);
    

    LocalDateTime to Date

    LocalDateTime localDateTime = LocalDateTime.now();
    
    Date date = Date.from( localDateTime.atZone( ZoneId.systemDefault()).toInstant());
    
    System.out.println(date);
    

    当然还有很多好玩的东西,LocalDate(年月日) LocalTime(时分秒)和LocalDateTime(年月日时分秒)都大差不差,所以讲一个即可

    四、Hutool(Java工具类库)

    一个比较好玩的Java工具类库,包含很多好玩的工具类,简单便捷。

    (1)、安装

    Maven

    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.6.1</version>
    </dependency>
    

    Gradle

    compile 'cn.hutool:hutool-all:5.6.1'

    Maven中央仓库
    Hutool 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。 如果你的项目使用JDK7,请使用Hutool 4.x版本

    (2)、使用

    	//该工具类时间都是格式化好的
    	System.out.println(DateUtil.now());//------------------------------取当前时间
    	
    	这也没啥好说的下载源码看中文注释即可,就不一一举例了,,,简简单单。
    

    总结

    总之好玩的工具类一大坨,不管是jdk原生还是别人封装的工具类,如果你想也可以自己通过jdk1.8的日期api自己封装属于自己的日期工具类,网上的日期工具类太多了,不要重复造轮子~~~~~~~~~~今天也是元气满满的一天

    以上就是 Java 时间日期相关的一些方法工具使用的详细内容,想要了解更多好玩有趣的 Java 时间日期相关的方法或工具类的其他资料,请关注W3Cschool其它相关文章!也希望大家能够多多地支持我们!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。