Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析
這篇文章主要介紹了Java時區(qū)轉(zhuǎn)換及Date類實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
一、時區(qū)的說明
地球表面按經(jīng)線從東到西,被劃成一個個區(qū)域,規(guī)定相鄰區(qū)域的時間相差1小時。在同一區(qū)域內(nèi)的東端和西端的人看到太陽升起的時間最多相差不過1小時。當(dāng)人們跨過一個區(qū)域,就將自己的時鐘校正1小時(向西減1小時,向東加1小時),跨過幾個區(qū)域就加或減幾小時 ,所以同一時刻在不同時區(qū)表示的時間是不一樣的。
二、時間的表示
我們平時表示時間時通常是以一個格式化的字符串來表示一個時間,例如"2019-11-5 20:05"這個字符串表示的是2019年11月5日20點05分。但這里有一個隱含的前提,時區(qū)是自己當(dāng)前所在的時區(qū),即東八區(qū)的人看到這個時間認為是東八區(qū)的20:05,而東九區(qū)的人會認為是東九區(qū)的20:05,實際上這兩個時間相差了一個小時。所以要正確的表示一個特定時刻,還要再加上時區(qū)信息,例如"2019-11-5 20:05 +8:00"這個字符串不管哪個時區(qū)的人看到都知道表示的是東八區(qū)的時間。
三、時間戳
時間戳表示的是一個時間間隔,從0時區(qū)來看,表示從"1970-1-1 00:00 +0:00"到現(xiàn)在(2019-11-5 12:05 +0:00)時刻的時間間隔,而從東八區(qū)來看表示從"1970-1-1 08:00 +8:00"到現(xiàn)在(2019-11-5 20:05 +8:00)的時間間隔。
間隔=現(xiàn)在-起點,因為現(xiàn)在和起點都相差了8小時,所以時間間隔是一樣的,同樣的道理,在任意時區(qū)中現(xiàn)在這一個時刻的時間戳都是一樣的。
四、Date類和時間戳
java的Date類中實際保存的是某一個時刻的時間戳,所以同一時刻在任意時區(qū)獲取到的Date對象都是一樣的。當(dāng)使用SimpleDateFormat格式化日期時,默認的會以當(dāng)前的系統(tǒng)時區(qū)來格式化日期,所以同一時刻不同時區(qū)的人格式化日期得到的結(jié)果才會有時差。
所以以下代碼,在東八區(qū)和東九區(qū)得到的輸出相差了一個小時,但它們的Date對象實際上表示了同一個時刻
public class TestDate { public static void main(String[] args) { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date=new Date(1572960924868L);//以時間戳來給定一個特定時刻 System.out.println(sdf.format(date)); } }
五、java中的時區(qū)轉(zhuǎn)換
SimpleDateFormat的對象可以設(shè)置時區(qū),這樣同一個Date對象就可以通過SimpleDateFormat來進行時區(qū)轉(zhuǎn)換
@Test public void test2(){ Date date=new Date(1572960924868L); SimpleDateFormat sdf8=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf8.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));//設(shè)置時區(qū)為東八區(qū) System.out.println("東八區(qū)的時間:"+sdf8.format(date));//輸出格式化日期 SimpleDateFormat sdf9=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf9.setTimeZone(TimeZone.getTimeZone("GMT+9:00"));//設(shè)置時區(qū)為東八區(qū) System.out.println("東九區(qū)的時間:"+sdf9.format(date));//輸出格式化日期 }
輸出的結(jié)果如下圖
同一個時刻1572960924868,先轉(zhuǎn)為Date對象,再通過SimpleDateFormat對時區(qū)進行轉(zhuǎn)換,并格式化成時間字符串輸出。
所以在實際的應(yīng)用中,遇到需要存儲時間的問題時,可以在數(shù)據(jù)庫中存儲時間對應(yīng)的時間戳,這樣在數(shù)據(jù)庫存儲時就不會有時區(qū)的問題,而在應(yīng)用中需要用到時間時,就把這個時間戳轉(zhuǎn)為Date,再通過SimpleDateFormat轉(zhuǎn)換成需要的時區(qū)的時間。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
idea導(dǎo)入配置Spring?Boot項目的詳細步驟教程
這篇文章主要給大家介紹了關(guān)于idea導(dǎo)入配置Spring?Boot項目的詳細步驟,在項目開發(fā)過程中,無論是導(dǎo)入運行團隊開發(fā)的項目,還是一些開源項目,還是其他的項目,想要在IDEA中完整的運行起來總有很多坑,需要的朋友可以參考下2023-08-08java實現(xiàn)圖像轉(zhuǎn)碼為字符畫的方法
這篇文章主要為大家詳細介紹了java實現(xiàn)圖像轉(zhuǎn)碼為字符畫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03Apache commons fileupload文件上傳實例講解
這篇文章主要為大家詳細介紹了Apache commons fileupload文件上傳實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10idea64.exe.vmoptions文件如何設(shè)置調(diào)整VM配置文件
這篇文章主要介紹了idea64.exe.vmoptions文件如何設(shè)置調(diào)整VM配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04springboot嵌套子類使用方式—前端與后臺開發(fā)的注意事項
這篇文章主要介紹了springboot嵌套子類使用方式—前端與后臺開發(fā)的注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03