天天看點

java時區,時間處理類等概念總結

Java中時區概念

UTC: 協調世界時,又稱世界統一時間、世界标準時間、國際協調時間。UTC也是指零時區的時間。協調世界時是以原子時秒長為基礎,在時刻上盡量接近于世界時的一種時間計量系統。協調世界時區使用“Z”來表示。

GMT: 格林尼治标準時間。格林尼治标準時間是19世紀中葉大英帝國的基準時間,同時也是事實上的世界基準時間。

GMT和UTC對比: 在不需要精确到秒的情況下,通常将GMT和UTC視作等同。但UTC 更加科學更加精确,它是以原子時為基礎,在時刻上盡量接近世界時的一種時間計量系統。在平常的java開發中将GMT和UTC視作相等即可。

Asia/Shanghai: 我們平常開發預設使用的時區,也可以簡單的認為等同于東八區時區(UTC/GMT+08:00),即比世界标注時間快8個小時。程式運作如下:其中ZoneId是Java8新加的代表一個時區的類。

java時區,時間處理類等概念總結

上述代碼以及時間輸出格式分析: 可以看出,Asia/Shanghai和UTC相差時間基本為8個小時

System.out.println(Instant.now());
System.out.println(LocalDateTime.now());
System.out.println(ZonedDateTime.now());
System.out.println(LocalDateTime.now(ZoneId.of("+00:00"))); //0時區的現在時間
System.out.println(ZonedDateTime.now(ZoneId.of("+00:00"))); //0時區的現在時間

---------------------------------------------------
//世界标準時間,其中T表示時分秒的開始(或者日期與時間的間隔),Z表示這是一個世界标準時間
2019-12-05T09:50:22.874Z
//不含時區資訊的時間,末尾沒有Z
2019-12-05T17:50:22.968
//含有時區資訊的時間,+08:00表示該時間是由世界标準時間加了8個小時得到的,[Asia/Shanghai]表示時區
2019-12-05T17:50:22.969+08:00[Asia/Shanghai]
2019-12-05T09:50:22.874
2019-12-05T09:50:22.874Z
           

Java8時間類對比

主要4類: String、Instant、LocalDateTime、ZonedDateTime。String是格式化的時間,Instant是時間戳,LocalDateTime是不含時區資訊的時間,ZonedDateTime是含有時區資訊的時間。

  • 其中String和LocalDateTime是等價的,本質上都是以字元串的形式輸出,不帶有任何時區資訊。
  • Instant與ZonedDateTime是等價的,兩者都是帶有時區資訊的。

其它一些類以及示例:

Clock: 該類用于擷取指定時區的目前日期、時間。可取代System類的currentTimeMillis()方法,而且提供了更多方法來擷取目前日期、時間。
Duration: 該類代表持續時間。可以非常友善地擷取一段時間。
LocalDate: 該類代表不帶時區的日期,例如2019-12-05。
LocalTime: 該類代表不帶時區的日期,例如18:20:20。
MonthDay: 該類僅代表月日,例如--04-12。注意月份前面會有兩個橫杠。
Year: 該類僅代表年,例如2019。
YearMonth: 該類僅代表年月,例如2019-12。
DayOfWeek: 這是一個枚舉類,定義了周日到周六的枚舉值。
Month: 這也是一個枚舉類,定義了一月到十二月的枚舉值。
           

上述時區說明可參考以下兩個部落格:https://www.cnblogs.com/jixp/articles/10587494.html

https://www.cnblogs.com/oldtrafford/p/9680791.html

時區以及時間類對比可參考(個人覺得寫的蠻好的):https://blog.csdn.net/u012107143/article/details/78790378

時間格式類

DateFormat: DateFormat是一個抽象類,它提供了如下幾個類方法用于擷取DateFormat對象。目前基本不怎麼使用了,一般都使用SimpleDateFormat。但是這邊還是記錄一下。

  • getDateInstance(): 傳回一個日期格式器,它格式化後的字元串隻有日期,沒有時間。該方法可以傳入多個參數,用于指定日期樣式和Locale(簡單來說是用于提供國際化參數,裡面有不同的國家和語言記錄)等采納數;如果不指定這些參數,則使用預設參數。
  • getTimeInstance(): 傳回一個時間格式器,它格式化後的字元串隻有時間,沒有日期。該方法可以傳入多個參數,用于指定時間樣式和Locale等參數;如果不指定這些參數,則使用預設參數。
  • getDateTimeInstance(): 傳回一個日期、時間格式器,它格式化後的字元串既有日期,也有時間。該方法可以傳入多個參數,用于指定日期樣式、時間樣式和Locale等參數;如果不指定這些參數,則使用預設參數。

  上面三個方法可以指定日期樣式.時間樣式參數,它們是DateFormat的4個靜态常量:FULL、LONG、MEDIUM和SHORT,通過這4個樣式參數可以控制生成的格式化字元串。反之,将字元串解析成Date對象時,也要符合上述4個樣式參數。其中MEDIUM為預設方式(可檢視源碼)。具體字元串格式如下:

java時區,時間處理類等概念總結

将字元串解析為Date的代碼如下所示,對應的,将Date解析成字元串使用的是format函數,傳入Date對象即可:

java時區,時間處理類等概念總結
java時區,時間處理類等概念總結

SimpleDateFormat: 前面介紹的DateFormat的parse()方法可以把字元串解析成Date對象,但實際上DateFormat的parse()方法不夠靈活-它要求被解析的字元串必須滿足特定的格式!為了更好地格式化日期、解析日期字元串,Java提供了SimpleDateFormat類。

  SimplateDateFormat是DateFormat的子類,正如它的名字所暗示的,它是“簡單”的日期格式器。SimpleDateFormat比DateFormat更簡單,但功能卻更強大。下面給出示例:

Date d1 = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("Gyyyy年中第D天");
//将d1格式化成字元串,輸出:公元2019年中第339天
String dateStr = sdf1.format(d1);
System.out.println(dateStr);

String str = "2019-12-05";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Date d2 = sdf2.parse(str);
//将日期字元串解析成日期,輸出:Thu Dec 05 00:00:00 CST 2019
System.out.println(d2);
           

  從上面的程式中可以看出,使用SimpleDateFormat可以将日期格式格式化成形如“公元2019年中第339天”這樣的字元串,也可以把形如“2019-12-05”這樣的字元串解析成日期,功能非常強大。SimpleDateFormat把日期格式化成怎樣的字元串,以及能把怎樣的字元串解析成Date,完全取決于建立該對象時指定的pattern參數,pattern是一個使用日期字段占位符的日期模闆。

DateTimeFormatter: 該類是Java8新增的日期、時間格式器,主要用于LocalDateTime,LocalDate,LocalTime等Java8新增的時間類。該類位于java.time.format包下面,相當于前面介紹的DateFormat和SimpleDateFormat的合體,功能相當強大。

  為了使用DateTimeFormatter進行格式化和解析,必須先擷取DateTimeFormatter對象,擷取DateTimeFormatter對象有如下三種常見的方式。

  • 直接使用靜态常量建立DateTimeFormatter格式器。DateTimeFormatter類中包含了大量形如ISO_LOCAL_DATE、ISO_LOCAL_TIME 、ISO_LOCAL_DATE_TIME等靜态常量,這些靜态常量本身就是DateTimeFormatter執行個體。
  • 使用代表不同風格的枚舉值來建立DateTimeFormatter格式器。在FormatStyle枚舉類中定義了FULL、LONG、MEDIUM、SHORT四個枚舉值,他們代表日期、時間的不同風格。
  • 根據模式字元串來建立DateTimeFormatter格式器。類似于SimpleDateFormat,可以采用模式字元串來建立DateTimeFormatter,如果需要了解DateTimeFormatter支援哪些模式字元串,則需要參考該類得API文檔。

簡單代碼示例

LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//将ldt1格式化成字元串,輸出:2019-12-05 20:17:40
String dateStr1 = dtf1.format(ldt1);
System.out.println(dateStr1);

String dateStr2 = "2019-12-05 20時16分42秒";
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH時mm分ss秒");
//将日期字元串解析成日期,輸出:2019-12-05T20:16:42
LocalDateTime ldt2 = LocalDateTime.parse(dateStr2,dtf2);
System.out.println(ldt2);
           

部分内容參考自瘋狂java講義第四版,若有侵權,歡迎聯系删除。