俠說java8-LocalDateTime等時間使用手冊(全),先mark後看

2020-12-23 俠夢說

前言

java8的時間日期api給我們提供了極大的便利。如何更好的熟悉使用時間api也是學習java8的一個很重要的知識點,下面我們一起來學習學習。

本篇文章代碼比較多,可以作為工具,需要使用時,再來查閱。

目錄

1.普通Date時間如何轉為LocalDateTime?

以上是從普通的Date對象轉換成java8時間的操作步驟,需要特別注意下時區的問題。

// 設置時區// ZoneId defaultZoneId = ZoneId.systemDefault(); ZoneId defaultZoneId = ZoneId.of("Asia/Shanghai"); System.out.println("set TimeZone : " + defaultZoneId); //以下每個注釋為輸出的結果 //date : Fri Jan 17 16:52:59 CST 2020 Date date = new Date(); System.out.println("date : " + date); //1. instant : 2020-01-17T08:52:59.235Z Instant instant = date.toInstant(); System.out.println("instant : " + instant); //Zone : 默認是UTC+0時區 //2. localDate : 2020-01-17 LocalDate localDate = instant.atZone(defaultZoneId).toLocalDate(); System.out.println("localDate : " + localDate); //3. LocalDateTime: 2020-01-17T16:52:59.235 LocalDateTime localDateTime = instant.atZone(defaultZoneId).toLocalDateTime(); System.out.println("localDateTime : " + localDateTime); //4. ZonedDateTime: 2020-01-17T16:52:59.235+08:00[Asia/Shanghai] ZonedDateTime zonedDateTime = instant.atZone(defaultZoneId); System.out.println("zonedDateTime : " + zonedDateTime);

2. java8時間如何轉換為普通Date?

轉換的過程和上面圖例剛好反過來,代碼如下:

//同樣,我們設置時區為上海 ZoneId defaultZoneId = ZoneId.of("Asia/Shanghai"); System.out.println(" Default TimeZone : " + defaultZoneId); LocalDate localDate = LocalDate.of(2020, 01, 17); Date date = Date.from(localDate.atStartOfDay(defaultZoneId).toInstant()); System.out.println("\n1. LocalDate -> Date"); System.out.println("localDate : " + localDate); System.out.println("date : " + date); LocalDateTime localDateTime = LocalDateTime.of(2020,01,17,17,46,31); Date date2 = Date.from(localDateTime.atZone(defaultZoneId).toInstant()); System.out.println("\n2. LocalDateTime -> Date"); System.out.println("localDateTime : " + localDateTime); System.out.println("date2 : " + date2); ZonedDateTime zonedDateTime = localDateTime.atZone(defaultZoneId); Date date3 = Date.from(zonedDateTime.toInstant()); System.out.println("\n3. ZonedDateTime -> Date"); System.out.println("zonedDateTime : " + zonedDateTime); System.out.println("date3 : " + date3);

3.如何比較時間?

無論是Date,還是java8中的localDate和localDateTime都可以通過compareTo方法來比較時間。SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date1 = sdf.parse("2020-01-17");Date date2 = sdf.parse("2020-01-16");System.out.println("前者如果較大則為正,相等為0,小於為負 : " + date1.compareTo(date2));LocalDate 和LocalDateTime提供了3個方法,isAfter(),isBefore(),isEqual()。

而在java8之前,我們是使用 after(), before(),equals。方法名有所區別,但是功能大同小異。

4.java8中的瞬點Instant

Instant代表一個瞬時的時間點值對象。

它從1970-01-01T00:00:00Z點毫秒計算的,是不可變的,並且是線程安全的。

5.獲取當前時間戳方式?

方式一:new Timestamp(System.currentTimeMillis());

方式二:new Date().getTime();

方式三:Instant。

方式四:Calendar.getInstance()

方式五:LocalDateTime.now()

方式六:LocalDate.now()

Timestamp timestamp = new Timestamp(System.currentTimeMillis());//2020-01-17 17:04:53.346System.out.println(timestamp);//return 1579251953703System.out.println(timestamp.getTime());// 時間戳轉換為 instant 2020-01-17T09:05:53.703ZInstant instant = timestamp.toInstant();System.out.println(instant);//return 1579251953703System.out.println(instant.toEpochMilli());// instant to timestamp 1579251893346Timestamp tsFromInstant = Timestamp.from(instant);System.out.println(tsFromInstant.getTime());

6.時間轉String

時間和字符串的轉換,相信大家都知道一般使用SimpleDateFormat來實現,但是這個api使用不當可能會有線程安全問題,這裡推薦使用如下的方式來做轉換,保證thread-safe。

//使用當前時間測試LocalDateTime now = LocalDateTime.now();System.out.println("Before : " + now);DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatDateTime = now.format(formatter);System.out.println("After : " + formatDateTime);

7.String轉時間

String now = "2020-01-17 17:30";DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");LocalDateTime formatDateTime = LocalDateTime.parse(now, formatter);System.out.println("Before : " + now);System.out.println("After : " + formatDateTime);System.out.println("After : " + formatDateTime.format(formatter));

8.Instant 轉LocalDateTime

Instant instant = Instant.now();System.out.println("Instant : " + instant);// 添加時區為上海LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));System.out.println("LocalDateTime : " + ldt);

9.LocalDateTime轉Instant

LocalDateTime dateTime = LocalDateTime.of(2020, 01, 17, 6, 17, 10);//LocalDateTime : 2020-01-17T06:17:10System.out.println("LocalDateTime : " + dateTime);// +hh:mm 如果設置時區為東八區,則要比原來時間晚8小時//Instant : 2020-01-16T22:17:10ZInstant instant = dateTime.toInstant(ZoneOffset.of("+08:00"));System.out.println("Instant : " + instant);

10.java8為什麼出現localDate和localDateTime?

在java8以前,時間是通過Date類等來表示,其中包含了一些比較差的API設計。例如,年份java.util.Date從1900開始,月份從1開始,天從0開始,這很不直觀。第三方日期和時間庫對此進行了一些彌補的流行,例如Joda-Time。

為了解決這些問題並在JDK內核中提供更好的支持,針對Java SE 8設計了一個新的並且沒有這些問題的日期和時間API。

Java SE 8附帶新的日期和時間API,java.time該API 為開發人員提供了大大改善的安全性和功能。新的API很好地建模了領域,並提供了用於對各種開發人員用例進行建模的大量類。

為了方便大家學習討論,我創建了一個java疑難攻堅互助大家庭,和其他傳統的學習交流不同。本群主要致力於解決項目中的疑難問題,在遇到項目難以解決的

問題時,都可以在這個大家庭裡尋求幫助。

公眾號關注 : 【俠夢的開發筆記】後回復【問題的答案】進入:java中Integer包裝類的基本數據類型是?

如果你也經歷過遇到項目難題,無從下手,

他人有可能可以給你提供一些思路和看法,一百個人就有一百種思路,

同樣,如果你也樂於幫助別人,那解決別人遇到的問題,也同樣對你是一種鍛鍊。

自學路上你不孤單,歡迎來公眾號【俠夢的開發筆記】,回復乾貨,為你準備了精選的學習視頻

相關焦點

  • 一學就會的 Python 時間轉化總結(超全)
    3.time time模塊是涉及到時間功能中最常用的一個模塊,在Python的相關時間需求中經常會用到,下面具體講解該模塊的使用方法。3.1模塊內容先看模塊的整體使用3.4gmtimelocaltime()得到的是本地時間,如果需要國際化,使用gmtime(),最好是使用格林威治時間。
  • Java開發手冊認證考試的50題
    2) ref 指的是使用普通的索引(normal index)。3) range 對索引進行範圍檢索。反例:explain 表的結果,type=index,索引物理文件全掃描,速度非常慢,這個 index 級別比較 range還低,與全表掃描是小巫見大巫。
  • Python時間模塊(筆記)
    tm_isdst=0)# time.localtime(時間戳),不傳參默認當前時間print(time.localtime()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=18, tm_min=41, tm_sec=7, tm_wday
  • java從菜鳥到大神學習路線:高級篇,最全系列教程!
    >Spring 5響應式編程Spring Boot 2.0性能優化使用單例、使用Future模式、使用線程池、選擇就緒、減少上下文切換、減少鎖粒度、數據壓縮、結果緩存線上問題分析dump獲取線程Dump、內存Dump、gc情況dump分析分析死鎖、分析內存洩露
  • JAVA8——JAVA成長之路
    在Java 8以前,一般的解決方式用foreach循環,但是在Java 8裡面我們可以使用stream:一串支持連續、並行聚集操作的元素。標準的 java.util.Date以及後來的java.util.Calendar一點沒有改善這種情況(可以這麼說,它們一定程度上更加複雜)。這種情況直接導致了Joda-Time——一個可替換標準日期/時間處理且功能非常強大的Java API的誕生。
  • xk-time 1.1.0 發布,Java 時間工具包,增加模糊解析日期功能
    converter calculator formatter calendar and cron expression tool set, based on java8 date and time API, thread safe, easy to use.
  • mysql的datetime和timestamp的區別還挺多,需要注意細節
    區別1,自動更新日期:datetime默認值時null不會自動更新,如果需要更新就得對datetime進行特殊設置。看sql或者從navicate區別2,日期存儲方式:timestamp存儲的時間會自動轉換為utc(格林威治標準時間),北京時間是東八區和它差了8個小時,再存儲的時候會減去8小時,所以如果你是用mybatis操作的讀取,需要配置下再加上8小時datetime是不會做出任何轉變區別3,範圍不一樣
  • java學習應用篇|idea的基本安裝和使用
    在漫長的學習生涯中,我們有時間扮演寺水的角色,有時候扮演 🐶 ,面對一個新的界面,不敢點, 即使心中有個聲音說,就是點那個,但一定要找一個人確認之後,才敢點.這裡我有仔細想過,可能更大的原因是為了,萬一點壞了的時候,能拉個同伴.... 你看,我是聽了你的才點的,現在這樣了.
  • 關於Java 字符串的全部,都在這份手冊裡了
    作者 | 沉默王二責編 | 屠敏頭圖 | CSDN 下載自視覺中國String 可以說是 Java 中最常見的數據類型,用來表示一串文本,它的使用頻率非常高,為了小夥伴們著想,我怒肝了一周,把字符串能寫的全都寫了出來。
  • 阿里巴巴 Java 開發手冊之工程分層
    版權歸屬:阿里巴巴集團技術團隊 著作目的:幫助更多軟體開發者搭建規範開發品臺,促進工程標準化本文分享關於阿里巴巴Java 開發手冊使用內容的工程分層結構,為幫助大家搭建一個有規範性得應用結構。需要原PDF文檔的朋友可私信提供(小編有全套阿里《java開發手冊》各版本)。
  • Java 入門教程詳解
    Java 在線工具JDK 1.6 在線中文手冊我的第一個JAVA程序以下我們通過一個簡單的實例來展示 Java 編程,創建文件 HelloWorld.java(文件名需與類名一致), 代碼如下:實例public class HelloWorld { public
  • Kubernetes的Local Persistent Volumes使用小記
    HostPath Volume,同為使用本地磁碟,區別在哪呢?,既可以在PVC聲明,又可以直接寫到Pod的配置中,但是Local PV只能在PVC聲明,對於PV資源,通常都有專人管理,這樣就避免了Pod開發者擅自使用本地磁碟帶來的衝突和風險;另外要注意的是,HostPath Volume和Local PV都是在使用本地磁碟,和常見的分布式文件系統相比,本地磁碟故障會導致數據丟失,保存重要數據請勿使用HostPath Volume和Local
  • 給大忙人們看的 Java NIO 極簡教程
    初始的position值為0,當一個byte、long等數據寫到Buffer後, position會向前移動到下一個可插入數據的Buffer單元。所以position最大可為capacity–1。讀數據時,也是從某特定位置讀。當將Buffer從寫模式切換到讀模式,position會被重置為0。當從Buffer的position處讀取數據時,position向前移動到下一個可讀的位置。
  • RocketMQ入坑系列(一)角色介紹及基本使用
    我在項目中遇到一種需求:後端抓取很多數據,抓取完成後需要進行解析處理,數據處理完成後要根據相應的規則發送給客戶,最後持久化入庫。後端抓取完數據後需要提醒另外一個程序:數據我弄完了,你解析處理吧。報錯了,這是由於RocketMQ的啟動文件都是按照JDK8配置的,而前面我特意配置的JDK版本是11,有很多命令參數不支持導致的,使用JDK8,正常啟動沒有問題的。
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    Java的運行(基礎必備)這條可能出看很簡單,java程序的運行誰不會呢?不過很多時候, 我們只是單純通過IDE去執行java程序,底層IDE又是如何執行java程序呢?很多人並不了解。這個知識點是最最基本的java開發者需要掌握的,初學java,第一個肯定是教你如何在命令行中執行java程序,但是很多人一旦把java學完了,IDE用上了,就把這個都忘了。
  • 零基礎學習初識Java筆記
    1、安裝JDK 1.8 64位的版本(特別重要 最新版是1.8)安裝 點下一步 最後點關閉64位的作業系統可以安裝64位的和32位的軟體32位的作業系統只能安裝32位的軟體2、配置環境變量因為.java文件 電腦是讀不懂的,編譯成二進位文件後,電腦才能讀懂我們都知道電腦只認識0 和1 電腦只認知二進位進位 二進位 八進位 十進位......
  • ThreadLocal的使用和實現原理
    This class provides thread-local variables.使用其實很簡單,保存值就調用set方法,獲得值調用get方法,最後調用remove方法刪除數據,防止內存洩漏和數據混亂。
  • Java之FileFilter過濾器的使用與及原理的簡單介紹
    「創作開運禮」Java之使用遞歸進行文件搜索,這次小編要介紹的是過濾器,我們可以使用過濾器來遍歷文件夾以及裡面的子文件夾還有相對應的文件1.File[] listFiles(FileFilter filter)java.io.FileFilter接口:用於抽象路徑名(File對象)的過濾器。
  • JAVA8 新特性詳解
    在包java.time下包含了一組全新的時間日期API。Clock 時鐘Clock類提供了訪問當前日期和時間的方法,Clock是時區敏感的,可以用來取代 System.currentTimeMillis() 來獲取當前的微秒數。某一個特定的時間點也可以使用Instant類來表示,Instant類也可以用來創建老的java.util.Date對象。
  • Pandas的介紹與基本使用
    如果說沒有pandas的出現,目前的金融數據分析領域還應該是R語言的天下。# 獲取當天日期,返回datetime對象t2 = datetime.datetime(2019,4,18) # 設置時間格式為datetime.datetime# datetime.timedelta() # 時間差today = datetime.datetime.today()yestoday = today - datetime.timedelta(1) # 以時間做運算print(today