歡迎關注微信公眾號:程序員小圈圈
原文首發于: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();
而且還可以進行比較,轉化等操作,如下:
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等使用方法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。