舊的日期/時(shí)間API的缺點(diǎn)
- Java日期與時(shí)間類(lèi)定義不一致,java.util和java.sql包都有日期類(lèi)恩脂,java.util.Date包含時(shí)間和日期汞幢,java.sql.Date只包含日期肛宋,將其納入java.sql包并不合理狂芋,同時(shí)兩個(gè)類(lèi)有相同的名字榨馁,這本身就是個(gè)糟糕的設(shè)計(jì)。
- 日期類(lèi)都是可變類(lèi)帜矾,是線程不安全的翼虫。
- 日期類(lèi)不提供國(guó)際化功能,沒(méi)有時(shí)區(qū)的支持屡萤,因此Java后續(xù)引入java.util.Calendar和java.util.TimeZone珍剑,但他們同樣存在上面的問(wèn)題。
以上問(wèn)題表明Java需要一個(gè)健壯的日期類(lèi)型
Java8日期API設(shè)計(jì)原則
- 不變性:新的日期API中死陆,所有類(lèi)都是不可變類(lèi)
- 關(guān)注點(diǎn)分離:將人類(lèi)可讀的日期時(shí)間與機(jī)器時(shí)間分離次慢,為日期(Dat)e、時(shí)間(Time)翔曲、日期時(shí)間(DateTime)、時(shí)間戳(unix timestamp)以及時(shí)區(qū)定義了不同的類(lèi)
- 清晰:所有的類(lèi)中都定義了用以完成相同動(dòng)作的方法劈愚,比如過(guò)去當(dāng)前實(shí)例的now()瞳遍,格式裝換的format()和parse()方法
- 實(shí)用操作:所有日期API都實(shí)現(xiàn)了常用的操作,如加菌羽、減掠械、格式化等
Java8時(shí)間/日期API相關(guān)包
- java.time:java8時(shí)間/日期API基礎(chǔ)包,常用的如LocalDate注祖、LocalTime猾蒂、LocalDateTime、Instant是晨、Period肚菠、Duration類(lèi)都在這個(gè)包下,這些類(lèi)都是不可變且線程安全的
- java.time.chrono:這個(gè)包為非ISO標(biāo)準(zhǔn)日歷系統(tǒng)提供泛化API罩缴,可以通過(guò)擴(kuò)展AbstractChronology類(lèi)自定義日歷系統(tǒng)
- java.time.format:提供格式化與解析功能的類(lèi)蚊逢,java.time包下的類(lèi)已經(jīng)提供了相應(yīng)的功能,所以一般不直接使用它們
- java.time.temporal:這個(gè)包包含一些時(shí)態(tài)對(duì)象箫章,可以用來(lái)找出相對(duì)于某個(gè)特定時(shí)間的日期烙荷,如某月的第一天或者最后一天,這些方法一般都是"withXXX"的格式
- java.time.zone:包含時(shí)區(qū)規(guī)則的類(lèi)
Java8常用日期/時(shí)間API示例
// 只包含日期檬寂,默認(rèn)格式為(yyyy-MM-dd)
LocalDate nowDate = LocalDate.now();
// 只包含時(shí)間终抽,默認(rèn)格式為(hh:mm:ss.zzz)
LocalTime nowTime = LocalTime.now();
// 既包含日期也包含時(shí)間,默認(rèn)格式為(yyyy-MM-dd-HH-mm-ss.zzz)
LocalDateTime nowDateTime = LocalDateTime.now();
// 用在機(jī)器可讀的時(shí)間格式上的,它以Unix時(shí)間戳的形式存儲(chǔ)日期時(shí)間
Instant instant = Instant.now();
// 可以在參數(shù)中傳遞ZonId指定時(shí)區(qū)
LocalDate nowDate = LocalDate.now(ZoneId.of("Asia/Shanghai"));
LocalTime nowTime = LocalTime.now(ZoneId.of("Asia/Shanghai"));
LocalDateTime nowDateTime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
- 創(chuàng)建指定的時(shí)間類(lèi)型昼伴,并獲取年匾旭、月、日
LocalDateTime date = LocalDateTime.of(2011,8,6,15,23,12);
// 可以通過(guò)parse方法以指定的模式將字符串轉(zhuǎn)換為日期類(lèi)型
LocalDateTime time = LocalDateTime.parse("2016-05-07 13:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
int year = date.getYear();
Month month = date.getMonth();
int day = date.getDayOfMonth();
System.out.println(date);
System.out.println("year: "+year+" month: "+ month.getValue()+" day: "+day);
- 在指定時(shí)間上加n年亩码、n個(gè)月季率、n周、n天......
LocalDateTime now = LocalDateTime.now();
LocalDateTime newTime = now.plusYears(2).plusMonths(3).plusHours(1).plusMinutes(2);
// 通過(guò)format方法可以獲得格式化的日期字符串
// 格式化類(lèi)型可以通過(guò)DateTimeFormatter.ofPattern(str)方法獲得
System.out.println(now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println(newTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
- LocalDateTime描沟、LocalDate飒泻、LocalTime互轉(zhuǎn)
LocalDateTime now = LocalDateTime.now();
LocalDate localDate = now.toLocalDate();
LocalTime localTime = now.toLocalTime();
LocalDateTime other = LocalDateTime.of(localDate, localTime);
- Date 與 LocalDateTime互轉(zhuǎn)
public void localDateTime2Date() {
LocalDateTime now = LocalDateTime.now();
ZoneId zoneId = ZoneId.systemDefault();
Instant instant = now.atZone(zoneId).toInstant();
Date date = Date.from(instant);
}
public void date2LocalDateTime() {
Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zoneId);
}
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime today = now.minusDays(1);
System.out.println(now.equals(today));
System.out.println(now.isBefore(today));
System.out.println(now.isAfter(today));
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者