歡迎關(guān)注微信公眾號:程序員小圈圈
原文首發(fā)于:www.zhangruibin.com
本文出自于:RebornChang的博客
轉(zhuǎn)載請標(biāo)明出處^_^
Instant
在看阿里開發(fā)規(guī)范手冊時,看到了這點:
【強(qiáng)制】SimpleDateFormat 是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。 正例:注意線程安全,使用DateUtils。亦推薦如下處理: private static final ThreadLocal df = new ThreadLocal() { @Override protected DateFormat initialValue() { return new SimpleDateFormat(“yyyy-MM-dd”); } }; 說明:如果是JDK8的應(yīng)用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。
上面提到了兩個知識點,Instant和LocalDateTime以及DateTimeFormatter。 細(xì)想之下之前對這個小知識還真的忽略了,所以來說下各個的用法。
Instant
通過查看源碼我們可以看到,Instant implements Temporal, TemporalAdjuster, Comparable, Serializable 注釋上寫著:This class is immutable and thread-safe.也就是線程安全。 簡單的來說, Instant 類代表的是某個時間(有點像 java.util.Date),它是精確到納秒的(而不是象舊版本的Date精確到毫秒)。如果使用納秒去表示一個時間則原來使用一位Long類型是不夠的,需要占用更多一點的存儲空間,實際上其內(nèi)部是由兩個Long字段組成,第一個部分保存的是自標(biāo)準(zhǔn)Java計算時代(就是1970年1月1日開始)到現(xiàn)在的秒數(shù),第二部分保存的是納秒數(shù)(永遠(yuǎn)不會超過999,999,999)。
那么怎么使用呢? 看下面:
Instant instantNow = Instant.now();
System.out.println("now:"+instantNow);
上面我們可以看到,直接now出來的時間和我們現(xiàn)在的北京時間也就是東八區(qū)時間有出入,看下源碼注釋,調(diào)用這個now()會查詢一個system UTC clock,也就是:
Clock clock = Clock.systemUTC();
也就是說,如果你在中國的話,得到的不是中國(東八區(qū))時間,那怎么才是中國時間呢?加八個小時就是北京時間:
Instant now = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));
那怎么獲得1970-01-01T00:00:00Z.到現(xiàn)在的秒數(shù)及毫秒數(shù)呢?
System.out.println("秒數(shù):"+now.getEpochSecond());
System.out.println("毫秒數(shù):"+now.toEpochMilli());
LocalDateTime
如果說上面的instant是需要手動增加時間來確定自己的時區(qū)時間,那么LocalDateTime就不需要增加時間,使用方法與instant是有相似之處的:
LocalDateTime localDateTime = LocalDateTime.now();
而且還可以進(jìn)行比較,轉(zhuǎn)化等操作,如下:
LocalDateTime localDateTime = LocalDateTime.now();
//當(dāng)前時間
System.out.println("localDateTime:"+localDateTime);
//format時間
System.out.println("localDateTimeFormat:"+localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
//定義localDateTime LocalDateTime localDateTime = LocalDateTime.now();
LocalDate now1 = LocalDate.now();
LocalTime now2 = LocalTime.now();
System.out.println("localDateTime:"+localDateTime);
System.out.println("now1:"+now1);
System.out.println("now2:"+now2);
System.out.println("localDateTimeFormat:"+localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));//定義localDateTime2 LocalDateTime localDateTime2 = localDateTime.minus(23, ChronoUnit.MONTHS);
localDateTime.atZone(ZoneId.systemDefault());
localDateTime2 = localDateTime2.withHour(3);
localDateTime2 = localDateTime2.withYear(2019);
localDateTime2 = localDateTime2.with(ChronoField.MONTH_OF_YEAR,3);
System.out.println("localDateTime2:"+localDateTime2);//比較兩個時間 Duration duration = Duration.between(localDateTime,localDateTime2);
System.out.println("比較日:"+duration.toDays());
System.out.println("比較時:"+duration.toHours());
System.out.println("比較分:"+duration.toMinutes());Period period = Period.between(localDateTime.toLocalDate(),localDateTime2.toLocalDate());
System.out.println("比較年:"+period.getYears());
System.out.println("比較月:"+period.getMonths());
System.out.println("比較日:"+period.getDays());
//互相轉(zhuǎn)化 Date date = Date.from(localDateTime2.atZone(ZoneId.systemDefault()).toInstant());
LocalDateTime dateTime = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault());localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
稍微提下LocalDate及LocalTime,這兩個欠著是不帶具體的時分秒只有年月日,后者是不帶具體的年月日只有時分秒。
DateTimeFormatter
強(qiáng)力的時間類型模式化工具,有多強(qiáng)呢? 看看下面:
//定義新的時間 LocalDateTime newTime = LocalDateTime.now();
//定義多種格式化類型 DateTimeFormatter[] formatters = new DateTimeFormatter[]{// 直接使用常量創(chuàng)建DateTimeFormatter格式器//第1種 DateTimeFormatter.ISO_LOCAL_DATE,//第2種DateTimeFormatter.ISO_LOCAL_TIME,//第3種DateTimeFormatter.ISO_LOCAL_DATE_TIME,//第4種// 使用本地化的不同風(fēng)格來創(chuàng)建DateTimeFormatter格式器 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM),//第5種DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG),//第6種// 根據(jù)模式字符串來創(chuàng)建DateTimeFormatter格式器 DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss")
};
// 依次使用不同的格式器對LocalDateTime進(jìn)行格式化 System.out.println("開始使用DateTimeFormatter進(jìn)行格式化");
for(int i = 0 ; i < formatters.length ; i++){// 下面兩行代碼的作用相同System.out.println(newTime.format(formatters[i]));System.out.println(formatters[i].format(newTime));
}
控制臺輸出:
開始使用DateTimeFormatter進(jìn)行格式化
2019-09-23
2019-09-23
15:42:47.06
15:42:47.06
2019-09-23T15:42:47.06
2019-09-23T15:42:47.06
2019年9月23日 星期一 15:42:47
2019年9月23日 星期一 15:42:47
下午03時42分47秒
下午03時42分47秒
公元2019%%九月%%23 15:42:47
公元2019%%九月%%23 15:42:47
OK,對于這幾點的簡單介紹到這里就差不多了,有興趣的小伙伴可以自行深入研究~~ 親 ,博主的微信公眾號 ‘程序員小圈圈 ’開始持續(xù)更新了喲~~ 識別二維碼或者直接搜索名字 ‘程序員小圈圈 ’ 即可關(guān)注本公眾號喲~~ 不只是有技術(shù)喲~~ 還有很多的學(xué)習(xí)娛樂資源免費(fèi)下載哦~~ 還可以學(xué)下教育知識以及消遣娛樂喲~~ 求關(guān)注喲~~ ’
總結(jié)
以上是生活随笔 為你收集整理的Instant及LocalDateTime等使用方法 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。