一、Calendar
(1)、Calender介紹
Calendar的中文翻譯是日歷,實際上,在歷史上有著許多種計時的方法。所以為了計時的統(tǒng)一,必需指定一個日歷的選擇。那現(xiàn)在最為普及和通用的日歷就是"Gregorian Calendar"。也就是我們在講述年份時常用"公元**年"。Calendar 在 Java 中是一個抽象類(Abstract Class),GregorianCalendar 是它的一個具體實現(xiàn)。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));//-----------------------現(xiàn)在是幾點 12小時制
System.out.println( cal.get(Calendar.HOUR_OF_DAY));//----------------現(xiàn)在是幾點 24小時制,一般使用這個屬性賦值
System.out.println(cal.get(Calendar.MILLISECOND));//----------------現(xiàn)在的毫秒
System.out.println( cal.get(Calendar.MINUTE));//---------------------現(xiàn)在是幾分
System.out.println( cal.get(Calendar.SECOND));//---------------------現(xiàn)在是幾秒
System.out.println(cal.get(Calendar.WEEK_OF_MONTH));//--------------現(xiàn)在是一個月中的第幾周
System.out.println(cal.get(Calendar.WEEK_OF_YEAR));//----------------現(xiàn)在是一個年中的第幾周
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)、沒什么可說的上翻譯就行
/**
* 以秒為標準時間的毫秒數(shù)
*/
public static final long MILLIS_PER_SECOND = 1000
/**
*以分鐘為標準時間的毫秒數(shù)
*/
public static final long MILLIS_PER_MINUTE = 60 * MILLIS_PER_SECOND
/**
*以小時為標準時間的毫秒數(shù)
*/
public static final long MILLIS_PER_HOUR = 60 * MILLIS_PER_MINUTE
/**
* 以天為標準時間的毫秒數(shù)
*/
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
/**
* 不應在標準編成構造獲取實列, 而應該直接使用類中的靜態(tài)方法,如:DateUtils.parseDate(str) 。
* 此構造函數(shù)意在允許需要一個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)
/**
* 判斷兩個日歷本地時間是否相同
* 除了比較數(shù)值外兩個日歷對象的類型還要相同
*
* @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,則使用系統(tǒng)默認的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,則使用系統(tǒng)默認的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 要加的年數(shù),可能為負數(shù)
*/
public static Date addYears(final Date date, final int amount)
/**
* 在日期date上增加amount月 。
*
* @param date 處理的日期,非null
* @param amount 要加的月數(shù),可能為負數(shù)
*/
public static Date addMonths(final Date date, final int amount)
/**
* 在日期date上增加amount周 。
*
* @param date 處理的日期,非null
* @param amount 要加的周數(shù),可能為負數(shù)
*/
public static Date addWeeks(final Date date, final int amount)
/**
* 在日期date上增加amount天 。
*
* @param date 處理的日期,非null
* @param amount 要加的天數(shù),可能為負數(shù)
*/
public static Date addDays(final Date date, final int amount)
/**
* 在日期date上增加amount小時 。
*
* @param date 處理的日期,非null
* @param amount 要加的小時數(shù),可能為負數(shù)
*/
public static Date addHours(final Date date, final int amount)
/**
* 在日期date上增加amount分鐘 。
*
* @param date 處理的日期,非null
* @param amount 要加的分鐘數(shù),可能為負數(shù)
*/
public static Date addMinutes(final Date date, final int amount)
/**
* 在日期date上增加amount秒 。
*
* @param date 處理的日期,非null
* @param amount 要加的秒數(shù),可能為負數(shù)
*/
public static Date addSeconds(final Date date, final int amount)
/**
* 在日期date上增加amount 毫秒 。
*
* @param date 處理的日期,非null
* @param amount 要加的毫秒數(shù),可能為負數(shù)
*/
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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)閾值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)
/**
* 根據(jù)指定的時間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)
/**
* 根據(jù)指定的時間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)
/**
* 根據(jù)指定的時間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)
/**
* 返回指定分段內(nèi)的毫秒數(shù) 。 所有大于分段的DateFields將被忽略 。
*
* 請求任何日期毫秒,將返回當前秒的毫秒數(shù) (返回一個數(shù)字在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)
/**
* 返回指定分段內(nèi)的秒數(shù) 。 所有大于分段的DateFields將被忽略 。
*
* 請求任何日期秒,將返回當前的分鐘的秒數(shù) (返回一個數(shù)字在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)
/**
* 返回指定分段內(nèi)的分鐘數(shù) 。 所有大于分段的DateFields將被忽略 。
*
* 請求任何日期分鐘,將返回當前的小時的分鐘數(shù) (返回一個數(shù)字在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)
/**
* 返回指定分段內(nèi)的小時數(shù) 。 所有大于分段的DateFields將被忽略 。
*
* 請求任何日期小時,將返回當前的天的小時數(shù) (返回一個數(shù)字在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)
/**
* 返回指定分段內(nèi)的天數(shù) 。 所有大于分段的DateFields將被忽略 。
*
* 請求任何日期天數(shù),將返回當前的月的天數(shù) (返回一個數(shù)字在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處的值 。
* 如果第一個日歷小于、等于、大于第二個,則對應返回負整數(shù)、0、正整數(shù)
*
* @param cal1 第一個日歷對象,非null
* @param cal2 第二個日歷對象,非null
* @param field Calendar中的閾值
*/
public static int truncatedCompareTo(final Calendar cal1, final Calendar cal2, final int field)
/**
* 截取比較斷兩個日期對象的field處的值 。
* 如果第一個日期小于、等于、大于第二個,則對應返回負整數(shù)、0、正整數(shù)
*
* @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));//-----------------當前日期。天數(shù)加1如果想建議填負數(shù)即可
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都是不可變的,更使用于多線程的使用環(huán)境中(從默認時區(qū)的系統(tǒng)時鐘獲取當前的日期時間。不用考慮時區(qū)差)
優(yōu)點:
1、之前使用的java.util.Date月份從0開始,我們一般會+1使用,很不方便,java.time.LocalDate月份和星期都改成了enum
2、java.util.Date和SimpleDateFormat都不是線程安全的,而LocalDate和LocalTime和最基本的String一樣,是不變類型,不但線程安全,而且不能修改。
3、java.util.Date是一個“萬能接口”,它包含日期、時間,還有毫秒數(shù),更加明確需求取舍
4、新接口更好用的原因是考慮到了日期時間的操作,經(jīng)常發(fā)生往前推或往后推幾天的情況。用java.util.Date配合Calendar要寫好多代碼,而且一般的開發(fā)人員還不一定能寫對。
(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);
// 手動創(chuàng)建一個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自己封裝屬于自己的日期工具類,網(wǎng)上的日期工具類太多了,不要重復造輪子~~~~~~~~~~今天也是元氣滿滿的一天
以上就是 Java 時間日期相關的一些方法工具使用的詳細內(nèi)容,想要了解更多好玩有趣的 Java 時間日期相關的方法或工具類的其他資料,請關注W3Cschool其它相關文章!也希望大家能夠多多地支持我們!