一、原來的日期時間
Java1.0中包含了一個Date類,但是它的大多數方法已經在Java 1.1引入Calendar類之后被棄用了。而Calendar並不比Date好多少。它們面臨的問題是:
① 可變性:象日期和時間這樣的類對象應該是不可變的。Calendar類中可以使用三種方法更改日歷字段:set()、add() 和 roll()。
② 偏移性:Date中的年份是從1900開始的,而月份都是從0開始的。
③格式化:格式化只對Date有用,Calendar則不行。
④此外,它們也不是線程安全的,不能處理閏秒等。
二、新增日期時間類型
java 8中引入的java.time API 已經糾正了過去的缺陷,將來很長一段時間內它都會為我們服務。Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。
java.time – 包含值對象的基礎包
java.time.chrono – 提供對不同的日歷系統的訪問。
java.time.format – 格式化和解析時間和日期
java.time.temporal – 包括底層框架和擴展特性
java.time.zone – 包含時區支持的類
Java 8 吸收了 Joda-Time 的精華,以一個新的開始為 Java 創建優秀的 API。新的 java.time 中包含了所有關於時鍾(Clock),本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)、時區(ZonedDateTime)和持續時間(Duration)的類。歷史悠久的 Date 類新增了 toInstant() 方法,用於把 Date 轉換成新的表示形式。這些新增的本地化時間日期 API 大大簡化了了日期時間和本地化的管理。
三、java.time 類
1、本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)
LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存儲“生日、紀念日”等日期。
LocalTime表示一個時間,而不是日期
LocalDateTime是用來表示日期和時間的,這是一個最常用的類之一。
方法名稱 |
描述 |
now() / now(ZoneId zone) |
靜態方法,根據當前時間創建對象/指定時區的對象 |
of() |
靜態方法,根據指定日期/時間創建對象 |
getDayOfMonth()/getDayOfYear() |
獲得月份天數(1-31) /獲得年份天數(1-366) |
getDayOfWeek() |
獲得星期幾(返回一個 DayOfWeek 枚舉值) |
getMonth() |
獲得月份, 返回一個 Month 枚舉值 |
getMonthValue() / getYear() |
獲得月份(1-12) /獲得年份 |
getHours()/getMinute()/getSecond() |
獲得當前對象對應的小時、分鍾、秒 |
withDayOfMonth()/withDayOfYear()/withMonth()/withYear() |
將月份天數、年份天數、月份、年份修改為指定的值並返回新的對象 |
with(TemporalAdjuster t) |
將當前日期時間設置為校對器指定的日期時間 |
plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours() |
向當前對象添加幾天、幾周、幾個月、幾年、幾小時 |
minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours() |
從當前對象減去幾月、幾周、幾天、幾年、幾小時 |
plus(TemporalAmount t)/minus(TemporalAmount t) |
添加或減少一個 Duration 或 Period |
isBefore()/isAfter() |
比較兩個 LocalDate |
isLeapYear() |
判斷是否是閏年(在LocalDate類中聲明) |
format(DateTimeFormatter t) |
格式化本地日期、時間,返回一個字符串 |
parse(Charsequence text) |
將指定格式的字符串解析為日期、時間 |
2、帶時區的日期、時間的處理
ZonedDateTime:一個在ISO-8601日歷系統時區的日期時間,如 2007-12-03T10:15:30+01:00 Europe/Paris。
其中每個時區都對應着ID,地區ID都為“{區域}/{城市}”的格式,例如:Asia/Shanghai等
now():使用系統時間獲取當前的ZonedDateTime
now(ZoneId):返回指定時區的ZonedDateTime
ZoneId:該類中包含了所有的時區信息,一個時區的ID,如 Europe/Paris
getAvailableZoneIds():靜態方法,可以獲取所有時區信息
of(String id):靜態方法,用指定的時區信息獲取ZoneId對象
Clock:使用時區提供對當前即時、日期和時間的訪問的時鍾。
Demo:
1 public static void main(String[] args) { 2 Set<String> availableZoneIds = ZoneId.getAvailableZoneIds(); 3 for (String string : availableZoneIds) { 4 System.out.println(string); 5 } 6
7 ZonedDateTime t = ZonedDateTime.now(); 8 System.out.println(t); 9
10 ZonedDateTime t1 = ZonedDateTime.now(ZoneId.of("America/New_York")); 11 System.out.println(t1); 12
13 // Clock clock = Clock.systemDefaultZone();
14 Clock c = Clock.system(ZoneId.of("America/New_York")); 15 System.out.println(c.getZone()); 16 System.out.println(c.instant()); 17 }
3、 java.time.format.DateTimeFormatter 類
該類提供了三種格式方法:
預定義的標准格式。如:ISO_DATE_TIME;ISO_DATE
本地化相關的格式。如:ofLocalizedDate(FormatStyle.MEDIUM)
自定義的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
Demo:
1 @Test 2 public void test12(){ 3 LocalDateTime now = LocalDateTime.now(); 4
5 DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH時mm分ss秒 SSS毫秒 E 是這一年的D天"); 6 String string = df.format(now); 7 System.out.println(string); 8
9 //預定義模式
10 DateTimeFormatter df2 = DateTimeFormatter.ISO_DATE_TIME; 11 System.out.println(df2.format(now)); 12
13 DateTimeFormatter df3 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG); 14 System.out.println(df3.format(now)); 15
16 DateTimeFormatter df4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT); 17 System.out.println(df4.format(now)); 18
19 DateTimeFormatter df5 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); 20 System.out.println(df5.format(now)); 21 }