Java中的日期工具類

一、Java中日期的概述

? ? 1、日期在Java中是一塊很復雜的知識,對于一個日期,在不同的語言國別環境中,日期的國際化,日期和時間之間的轉換,日期的加減運算,日期的展示格式等,都是非常復雜的問題。
? ? 2、在Java中,操作日期常用的類有以下四種:
? ? ? ? 1)Date類
? ? ? ? 2)Calendar類
? ? ? ? 3)DateFormat類
? ? ? ? 4)SimpleDateFormat類

二、日期操作類詳情

? ? 1、Date類
? ? ? ? Date表示的是特定的瞬間,精確到毫秒。1秒=1000毫秒,1毫秒=1000微秒。但是這個類中很多方法都已過時,不推薦使用了,下面僅介紹幾個沒有過時的方法。
? ? ? ? 構造方法:
? ? ? ? ? ? Date() ,分配對象并用當前時間初始化此對象,以表示分配他的時間。
? ? ? ? ? ? Date(long date),分配Date對象并初始化此對象,以表示自從標準基準時間(1970年1月1日00:00:00 GMT)以來的指定毫秒數
? ? ? ? 常用方法:

Date類常用方法

? ? ? ? String toString( ),把此Date對象轉換為以下形式的String:dow mon dd hh:mm:ss zzz yyyy:
? ? ? ? ? ? dow是周幾:Sun、Mon、Tue、Web、Thu、Fri、Sat,周日-周六;
? ? ? ? ? ? mon是幾月:Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、Nov、Dec,1-12月;
? ? ? ? ? ? dd是幾號:按照通常方式,由整數1-31表示,顯示為兩位十進制數;
? ? ? ? ? ? hh是小時:由從0-23的整數表示,從晚上12點-凌晨1點的時間是0點,從中午12點-下午1點的時間是12點;
? ? ? ? ? ? mm是分鐘:由從0-59的整數表示;
? ? ? ? ? ? ss是秒:由0-61的整數表示,這里跟我們對時間的認知就有一些不一樣了,其中的60,61只對閏秒發生,他也只是用在實際正確跟蹤閏秒的Java實現中。
? ? ? ? ? ? zzzz是時區,如果沒有提供時區信息,則該字段為空;
? ? ? ? ? ? yyyy是年份,顯示為4位十進制數。

? ? 2、Calendar類
? ? ? ? Calendar提供了獲取和設置各種日歷字段的方法;
? ? ? ? Calendar提供了一個類方法getInstance,以獲得此類型的一個通用的對象,他返回了一個Calendar對象,其日歷字段已有當前時間和日期初始化。一個calendar的實例是系統時間的抽象表示,從中可以知道年月日等詳細信息。

Calendar常用方法及變量

? ? ? ? Calendar中的一些陷阱:
? ? ? ? ? ? 1、星期是從周日開始的,常量值為0.
? ? ? ? ? ? 2、月份是從1月開始的,常量值位0.
? ? ? ? ? ? 3、每月的第一天值為1.

? ? 3、DateFormat類
? ? ? ? DateFormat是日期/時間格式化子類的抽象類,它以與語言無關的方式格式化并解析日期或時間。日期/時間格式化子類(如SimpleDateFormat)允許進行格式化(也就是日期->文本)、解析(文本->日期)和標準化。將日期表示為Date對象,或者表示為從GMT 1970年1月1日 00:00:00 這一刻開始的毫秒數。
? ? ? ? DateFormat提供了很多類方法,以獲得基于默認或給定語言環境和多種格式話風格的默認日期時間Formatter。
? ? ? ? DateFormat是無法進行直接實例化的,他是一個抽象類,可以通過它提供的靜態方法來獲取這個類的實例。

常用方法

? ? 4、SimpleDateFormat類
? ??????如果要得到用戶自己需要的日期顯示格式,則必須通過DateFormat的子類SimpleDateFormat類。
? ? ? ? 它定義了以下模式字母:
? ??????????y?年?Year?1996;
????????????M?年中的月份?Month?July;?Jul;
????????????w?年中的周數
????????????W?月份中的周數
????????????D?年中的天數
????????????d?月份中的天數
????????????F?月份中的星期
????????????E?星期中的天數?Text?Tuesday
????????????a?Am/pm?標記?Text?PM
????????????H?一天中的小時數(0-23)
????????????k?一天中的小時數(1-24)
????????????K?am/pm?中的小時數(0-11)
????????????h?am/pm?中的小時數(1-12)
????????????m?小時中的分鐘數
????????????s?分鐘中的秒數
? ? ? ? ? ? S 毫秒數

常用方法

三、日期工具類

public class DateUtil {
????/**
????* 日期格式化
????*
????* @param pattern pattern
????* @param date 日期
? ? * @return 格式化后的字符串
????*/
????public static String dateFormat(String pattern, Date date) {
?????????if (date == null || StringUtils.isEmpty(pattern)) {
?????????????return "";
?????????}
?????????try {
?????????????LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
?????????????return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
?????????} catch (Exception e) {
?????????????log.error("DateUtils dateFormat exception:{}", e.getMessage());
?????????????return "";
?????????}
????}
//?獲取當前月的上一個月的第一天
????public static String getPreviousMonthOfFirstDay() {
?????????SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_WITH_HORIZONTAL_LINE);
?????????Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00"));
? ? ? ? // 月份-1
?????????calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
? ? ? ? //日期設為1號
?????????calendar.set(Calendar.DAY_OF_MONTH, 1);
?????????String date = dateFormat.format(calendar.getTime());
?????????return date;
????}

//?獲取傳入日期的凌晨0點0分0秒,同理可得,傳入時間的23:59:59秒或者其他指定日期
????public static Date getDayOfBeforeDawn(Date date) {
?????????if (Objects.isNull(date)) {
?????????????return null;
?????????}
?????????Calendar calendar = Calendar.getInstance();
?????????calendar.setTime(date);
?????????calendar.set(Calendar.HOUR_OF_DAY, 0);
?????????calendar.set(Calendar.MINUTE, 0);
?????????calendar.set(Calendar.SECOND, 0);
?????????return calendar.getTime();
????}
}

????日期工具類太多了,這里就不一一舉例了,不過將上面四種日期操作類弄明白之后,這些日期工具類無論是看還是寫,都沒啥問題了吧。原理都是一樣的嘛。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容