日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Instant及LocalDateTime等使用方法

發布時間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Instant及LocalDateTime等使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎關注微信公眾號:程序員小圈圈
原文首發于:www.zhangruibin.com
本文出自于:RebornChang的博客
轉載請標明出處^_^

Instant

在看阿里開發規范手冊時,看到了這點:

【強制】SimpleDateFormat 是線程不安全的類,一般不要定義為static變量,如果定義為static,必須加鎖,或者使用DateUtils工具類。 正例:注意線程安全,使用DateUtils。亦推薦如下處理:
private static final ThreadLocal df = new ThreadLocal() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat(“yyyy-MM-dd”);
}
};
說明:如果是JDK8的應用,可以使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替Simpledateformatter,官方給出的解釋:simple beautiful strong immutable thread-safe。

上面提到了兩個知識點,Instant和LocalDateTime以及DateTimeFormatter。
細想之下之前對這個小知識還真的忽略了,所以來說下各個的用法。

Instant

通過查看源碼我們可以看到,Instant implements Temporal, TemporalAdjuster, Comparable, Serializable
注釋上寫著:This class is immutable and thread-safe.也就是線程安全。
簡單的來說, Instant 類代表的是某個時間(有點像 java.util.Date),它是精確到納秒的(而不是象舊版本的Date精確到毫秒)。如果使用納秒去表示一個時間則原來使用一位Long類型是不夠的,需要占用更多一點的存儲空間,實際上其內部是由兩個Long字段組成,第一個部分保存的是自標準Java計算時代(就是1970年1月1日開始)到現在的秒數,第二部分保存的是納秒數(永遠不會超過999,999,999)。

那么怎么使用呢?
看下面:

Instant instantNow = Instant.now(); System.out.println("now:"+instantNow);

上面我們可以看到,直接now出來的時間和我們現在的北京時間也就是東八區時間有出入,看下源碼注釋,調用這個now()會查詢一個system UTC clock,也就是:

Clock clock = Clock.systemUTC();

也就是說,如果你在中國的話,得到的不是中國(東八區)時間,那怎么才是中國時間呢?加八個小時就是北京時間:

Instant now = Instant.now().plusMillis(TimeUnit.HOURS.toMillis(8));

那怎么獲得1970-01-01T00:00:00Z.到現在的秒數及毫秒數呢?

System.out.println("秒數:"+now.getEpochSecond()); System.out.println("毫秒數:"+now.toEpochMilli());

LocalDateTime

如果說上面的instant是需要手動增加時間來確定自己的時區時間,那么LocalDateTime就不需要增加時間,使用方法與instant是有相似之處的:

LocalDateTime localDateTime = LocalDateTime.now();

而且還可以進行比較,轉化等操作,如下:

  • format時間
LocalDateTime localDateTime = LocalDateTime.now(); //當前時間 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());
  • 轉化
//互相轉化 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

強力的時間類型模式化工具,有多強呢?
看看下面:

//定義新的時間 LocalDateTime newTime = LocalDateTime.now(); //定義多種格式化類型 DateTimeFormatter[] formatters = new DateTimeFormatter[]{// 直接使用常量創建DateTimeFormatter格式器//第1種 DateTimeFormatter.ISO_LOCAL_DATE,//第2種DateTimeFormatter.ISO_LOCAL_TIME,//第3種DateTimeFormatter.ISO_LOCAL_DATE_TIME,//第4種// 使用本地化的不同風格來創建DateTimeFormatter格式器 DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM),//第5種DateTimeFormatter.ofLocalizedTime(FormatStyle.LONG),//第6種// 根據模式字符串來創建DateTimeFormatter格式器 DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd HH:mm:ss") }; // 依次使用不同的格式器對LocalDateTime進行格式化 System.out.println("開始使用DateTimeFormatter進行格式化"); for(int i = 0 ; i < formatters.length ; i++){// 下面兩行代碼的作用相同System.out.println(newTime.format(formatters[i]));System.out.println(formatters[i].format(newTime)); }

控制臺輸出:

開始使用DateTimeFormatter進行格式化 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,對于這幾點的簡單介紹到這里就差不多了,有興趣的小伙伴可以自行深入研究~~
,博主的微信公眾號
程序員小圈圈’開始持續更新了喲~~
識別二維碼或者直接搜索名字 ‘程序員小圈圈’ 即可關注本公眾號喲~~
不只是有技術喲~~
還有很多的學習娛樂資源免費下載哦~~
還可以學下教育知識以及消遣娛樂喲~~
求關注喲~~

總結

以上是生活随笔為你收集整理的Instant及LocalDateTime等使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。