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

2021-01-15 俠夢說

前言

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基礎系列|示例講解時間模塊datetime
    Python 有很多種方式處理日期和時間,常見的時間處理的模塊是datetime、time、calendar。能融匯貫通的了解和使用這三個模塊,才能輕而易舉地用python處理時間。本文以此為目的,通過講述各個時間模塊的概述、函數及相關知識細節、以及相應的示例來講透它們的使用方式。
  • Pandas 數據處理|Datetime 時間模塊在 Pandas 中的使用
    Datatime 作為 Python 中的時間模塊類型,處理時間有關數據是非常方便的, Pandas 作為數據分析程序包同樣也支持 DataTime 數據機制,例如1,函數 to_datetime() 將數據列表中的 Series 列轉化為 datetime 類型,#Convert the type to datetimeapple.Date =
  • python日期和時間的操作方法匯總
    日期和時間可以說是一種獨特的數據類型,既不同於數字,也不同於字符串,而且有自己獨特的運算規則。在不同的程式語言中,都會將日期和時間與常規的數據類型獨立開來,單獨進行操作。
  • 【Python基礎】13個知識點,系統整理Python時間處理模塊Datetime
    首先要介紹的,是大家平時用的較多的 datetime 模塊,它屬於 Python 的內置模塊,功能相對較全。datetime.datetime(2020, 10, 12, 20, 10, 1)通過 datetime 的實例化,是我們使用時間是經常用到的方法,在日常使用過程中,我們可能只需要具體到某天,或者只需要具體到某天的某個時間點,這時候,也可以通過 datetime 的一些方法來實現。
  • Python時間模塊(筆記)
    ()) # time.struct_time(tm_year=2020, tm_mon=5, tm_mday=31, tm_hour=10, tm_min=38, tm_sec=23, tm_wday=6, tm_yday=152, tm_isdst=0)# time.localtime(時間戳),不傳參默認當前時間print(time.localtime()) # time.struct_time
  • 萬字概覽 Java 虛擬機
    為什麼對象最多活過 15 次 YGC 後就會晉升老年代因為對象頭中記錄 YGC 存活周期的欄位只有 4 bit 長度,最大表示數字就是 15。但這並不是說對象一定要活過 15 次 YGC 才能晉升到老年代,因為每次 YGC 後都會對這個閾值進行重新計算。
  • Java8 lambda表達式語法
    java8的安裝工欲善其器必先利其器,首先安裝JDK8。過程省略,大家應該都可以自己搞定。但是有一點這裡強調一下(Windows系統):目前我們工作的版本一般是java 6或者java 7,所以很多人安裝java8基本都是學習為主。這樣就在自己的機器上會存在多版本的JDK。而且大家一般是希望在命令行中執行java命令是基於老版本的jdk。
  • 傻傻分不清楚系列|Python中各種時間處理方法(上)
    我們先看一下time庫。time庫主要圍繞unix時間戳進行操作,主要包含一個類:struct_time。那什麼是unix時間戳?它是指格林威治時間1970年01月01日00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數,比如格林威治時間1970年01月01日00分01秒就以數值1來記載。
  • 打工人打工魂,打工的必會java調用python的幾種用法
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】,經微信公眾號授權轉載,如需轉載與原文作者聯繫圖丨pexelsjava調用python的幾種用法(看這篇就夠了)在java類中直接執行python語句準備工作:創建maven工程,結構如下:到官網https://www.jython.org
  • Java內部類新解,你沒有見過的船新版本
    inner class裡面又有兩個特殊一點的類: local class和 anonymous class。特殊之處主要在於語法使用上,實質功能是差不多的。 官方 是這樣解釋的:Nested classes are divided into two categories: static and non-static.
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口 加載階段完成後,這些二進位字節流按照虛擬機所需的格式存儲在方法區之中。
  • Java transient關鍵字使用小記
    1.transient的作用及使用方法我們都知道一個對象只要實現了Serilizable接口,這個對象就可以被序列化,java的這種序列化模式為開發者提供了很多便利,我們可以不必關係具體序列化的過程,只要這個類實現了Serilizable接口,這個類的所有屬性和方法都會自動序列化。
  • java之數組作為方法參數的使用
    各位小夥伴們大家好,這次小編要介紹的是java作為方法參數,返回值的使用。首先,小編要介紹的是java作為方法參數的使用。int[] array*/public static void printArray(int[] array){System.out.println(array);//printArray方法收到的參數:地址值for(int i=0;i<array.length;i++){//數組的遍歷System.out.println(array[i]);}}}在數組作為方法參數使用的時候,
  • 聶政刺殺俠累成功後為何先毀容後自殺?不想連累家人只是次要原因
    既然說到了聶政刺殺韓傀(字,俠累),那麼他成功後為何先毀容後自殺?其實不想連累家人只是次要原因,主要原因是他心中有高於生命的行為準則,且聽飛魚先從嚴仲子說起慢慢道來。嚴仲子和俠累的恩怨。其實,史書裡他們倆的恩怨並沒有確切的記載,《史記》中也只有寥寥數字:與韓相俠累有卻,但是別著急,因為《東周列國志》的作者馮夢龍先生為我們把這塊空白給填滿了,馮先生是這樣說的,嚴仲子和俠累本是八拜之交,因為嚴仲子是有錢的商人,就資助俠累坐上了韓國的相國。
  • 學Java反射,看這篇就夠了 | 原力計劃
    我怎麼使用它?這麼多的問題,這是在挑釁啊,既然如此,那麼我想起來宮本的那句:想挑戰的,一個一個來。先解決第一個問題。 超過二秒後,我表示看不下去了,就不能簡單點嗎?這是給人看的嗎?像我這種人,是看不下去的。我們來一句話定義反射:反射就是把 Java 類中的各種成分映射成一個個的 Java 對象。
  • 399頁電氣簡圖用圖形符號使用手冊,工程圖紙全掌握!
    399頁電氣簡圖用圖形符號使用手冊,電氣圖紙全掌握,受用無窮!399頁電氣簡圖用圖形符號使用手冊,識圖從此無憂全套手冊,目錄概覽本手冊旨在向標準使用人員介紹最新版本的《電氣簡圖用圖形符號》標準,說明符號的使用方法,並重點對新舊標準中的符號進行對比,幫助熟悉舊標準的人向使用新標準過渡,達到正確使用新標準和按新標準畫圖的目的。
  • 使用Java API的5個技巧
    對於很多開發團隊來說,對於其APP和API進行管理認證和訪問控制要耗費很多的時間,因此我們需想分享一些技巧,它們能節約你的時間,減少代碼編寫量,並能讓你的應用更加安全和易於維護。先介紹下本文提及的背景知識:Okta是一個基於REST、JSON API構建的Java應用,使用Spring框架構建。我們公司的應用,是保存用戶的身份憑證和其他公司的敏感數據,所以對我們來說,安全是最重要的。
  • Pandas的介紹與基本使用
    3.3.1、時間序列類型時間戳:特定時刻固定時期:如2019年1月時間間隔:起始時間-結束時間3.3.2、Python庫:datatimedate、datetime、timedeltaimport datetime# datetime.date() # date對象today = datetime.date.today() # 獲取當天日期,返回date
  • 如何使用JAVA反射/JAVA反射實例
    JAVA反射技術,在平時我們的開發中雖然很少會用到例如讀取配製文件可能就用到這個技術,但在我們所使用的框架源碼中是經常會用到的。   e.printStackTrace() ;  }  System.out.println(per) ; // 內容輸出,調用toString() }};4、使用實例
  • 一個全基因組重測序分析實戰
    流程介紹在本文,我將會把我的 全基因組重測序數據走完上面所有的流程,並給出代碼和時間消耗情況。,讓大家對全基因組重測序分析有一個感性的認知。總之,對這個全基因組數據來說,時間消耗太誇張了,以至於我寫完這篇文章這GATK的4個bam操作還沒跑完。對L1需要約8小時,那麼對merge.bam應該是需要40個小時。