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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java中的时区转换

發(fā)布時(shí)間:2023/12/20 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的时区转换 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自 halfclear 原文:https://blog.csdn.net/halfclear/article/details/77573956

1.Date中保存的是什么
在java中,只要我們執(zhí)行
Date date = new Date();
就可以得到當(dāng)前時(shí)間。如:

Date date = new Date(); System.out.println(date);

輸出結(jié)果是:
Thu Aug 24 10:15:29 CST 2017
也就是我執(zhí)行上述代碼的時(shí)刻:2017年8月24日10點(diǎn)15分29秒。是不是Date對(duì)象里存了年月日時(shí)分秒呢?不是的,Date對(duì)象里存的只是一個(gè)long型的變量,其值為自1970年1月1日0點(diǎn)至Date對(duì)象所記錄時(shí)刻經(jīng)過(guò)的毫秒數(shù),調(diào)用Date對(duì)象getTime()方法就可以返回這個(gè)毫秒數(shù),如下代碼:

Date date = new Date(); System.out.println(date + ", " + date.getTime());

輸出如下:
Thu Aug 24 10:48:05 CST 2017, 1503542885955
即上述程序執(zhí)行的時(shí)刻是2017年8月24日10點(diǎn)48分05秒,該時(shí)刻距離1970年1月1日0點(diǎn)經(jīng)過(guò)了1503542885955毫秒。反過(guò)來(lái)說(shuō),輸出的年月日時(shí)分秒其實(shí)是根據(jù)這個(gè)毫秒數(shù)來(lái)反算出來(lái)的。

2.時(shí)區(qū)
全球分為24個(gè)時(shí)區(qū),相鄰時(shí)區(qū)時(shí)間相差1個(gè)小時(shí)。比如北京處于東八時(shí)區(qū),東京處于東九時(shí)區(qū),北京時(shí)間比東京時(shí)間晚1個(gè)小時(shí),而英國(guó)倫敦時(shí)間比北京晚7個(gè)小時(shí)(英國(guó)采用夏令時(shí)時(shí),8月英國(guó)處于夏令時(shí))。比如此刻北京時(shí)間是2017年8月24日11:17:10,則東京時(shí)間是2017年8月24日12:17:10,倫敦時(shí)間是2017年8月24日4:17:10。

既然Date里存放的是當(dāng)前時(shí)刻距1970年1月1日0點(diǎn)時(shí)刻的毫秒數(shù),如果此刻在倫敦、北京、東京有三個(gè)程序員同時(shí)執(zhí)行如下語(yǔ)句:

Date date = new Date();

那這三個(gè)date對(duì)象里存的毫秒數(shù)是相同的嗎?還是北京的比東京的小3600000(北京時(shí)間比東京時(shí)間晚1小時(shí),1小時(shí)為3600秒即3600000毫秒)?答案是,這3個(gè)Date里的毫秒數(shù)是完全一樣的。確切的說(shuō),Date對(duì)象里存的是自格林威治時(shí)間( GMT)1970年1月1日0點(diǎn)至Date對(duì)象所表示時(shí)刻所經(jīng)過(guò)的毫秒數(shù)。所以,如果某一時(shí)刻遍布于世界各地的程序員同時(shí)執(zhí)行new Date語(yǔ)句,這些Date對(duì)象所存的毫秒數(shù)是完全一樣的。也就是說(shuō),Date里存放的毫秒數(shù)是與時(shí)區(qū)無(wú)關(guān)的。

繼續(xù)上述例子,如果上述3個(gè)程序員調(diào)用那一刻的時(shí)間是北京時(shí)間2017年8月24日11:17:10,他們繼續(xù)調(diào)用

System.out.println(date);

那么北京的程序員將會(huì)打印出2017年8月24日11:17:10,而東京的程序員會(huì)打印出2017年8月24日12:17:10,倫敦的程序員會(huì)打印出2017年8月24日4:17:10。既然Date對(duì)象只存了一個(gè)毫秒數(shù),為什么這3個(gè)毫秒數(shù)完全相同的Date對(duì)象,可以打印出不同的時(shí)間呢?這是因?yàn)镾ysytem.out.println函數(shù)在打印時(shí)間時(shí),會(huì)取操作系統(tǒng)當(dāng)前所設(shè)置的時(shí)區(qū),然后根據(jù)這個(gè)時(shí)區(qū)將同毫秒數(shù)解釋成該時(shí)區(qū)的時(shí)間。當(dāng)然我們也可以手動(dòng)設(shè)置時(shí)區(qū),以將同一個(gè)Date對(duì)象按不同的時(shí)區(qū)輸出。可以做如下實(shí)驗(yàn)驗(yàn)證:

Date date = new Date(1503544630000L); // 對(duì)應(yīng)的北京時(shí)間是2017-08-24 11:17:10SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 北京 bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 設(shè)置北京時(shí)區(qū)SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 東京 tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo")); // 設(shè)置東京時(shí)區(qū)SimpleDateFormat londonSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 倫敦 londonSdf.setTimeZone(TimeZone.getTimeZone("Europe/London")); // 設(shè)置倫敦時(shí)區(qū)System.out.println("毫秒數(shù):" + date.getTime() + ", 北京時(shí)間:" + bjSdf.format(date)); System.out.println("毫秒數(shù):" + date.getTime() + ", 東京時(shí)間:" + tokyoSdf.format(date)); System.out.println("毫秒數(shù):" + date.getTime() + ", 倫敦時(shí)間:" + londonSdf.format(date));

輸出為:
毫秒數(shù):1503544630000, 北京時(shí)間:2017-08-24 11:17:10
毫秒數(shù):1503544630000, 東京時(shí)間:2017-08-24 12:17:10
毫秒數(shù):1503544630000, 倫敦時(shí)間:2017-08-24 04:17:10

可以看出,同一個(gè)Date對(duì)象,按不同的時(shí)區(qū)來(lái)格式化,將得到不同時(shí)區(qū)的時(shí)間。由此可見(jiàn),Date對(duì)象里保存的毫秒數(shù)和具體輸出的時(shí)間(即年月日時(shí)分秒)是模型和視圖的關(guān)系,而時(shí)區(qū)(即Timezone)則決定了將同一個(gè)模型展示成什么樣的視圖。

3.從字符串中讀取時(shí)間
有時(shí)我們會(huì)遇到從一個(gè)字符串中讀取時(shí)間的要求,即從字符串中解析時(shí)間并得到一個(gè)Date對(duì)象,比如將"2017-8-24 11:17:10"解析為一個(gè)Date對(duì)象。現(xiàn)在問(wèn)題來(lái)了,這個(gè)時(shí)間到底指的是北京時(shí)間的2017年8月24日11:17:10,還是東京時(shí)間的2017年8月24日11:17:10?如果指的是北京時(shí)間,那么這個(gè)時(shí)間對(duì)應(yīng)的東京時(shí)間2017年8月24日12:17:10;如果指的是東京時(shí)間,那么這個(gè)時(shí)間對(duì)應(yīng)的北京時(shí)間就是2017年8月24日10:17:10。因此,只說(shuō)年月日時(shí)分秒而不說(shuō)是哪個(gè)時(shí)區(qū)的,是有歧義的,沒(méi)有歧義的做法是,給出一個(gè)時(shí)間字符串,同時(shí)指明這是哪個(gè)時(shí)區(qū)的時(shí)間。
從字符串中解析時(shí)間的正確作法是:指定時(shí)區(qū)來(lái)解析。示例如下:

String timeStr = "2017-8-24 11:17:10"; // 字面時(shí)間 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 設(shè)置北京時(shí)區(qū) Date d = sdf.parse(timeStr); System.out.println(sdf.format(d) + ", " + d.getTime());

輸出為:
2017-08-24 11:17:10, 1503544630000,

將一個(gè)時(shí)間字符串按不同時(shí)區(qū)來(lái)解釋,得到的Date對(duì)象的值是不同的。驗(yàn)證如下:

String timeStr = "2017-8-24 11:17:10"; // 字面時(shí)間 SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); Date bjDate = bjSdf.parse(timeStr); // 解析 System.out.println("字面時(shí)間: " + timeStr +",按北京時(shí)間來(lái)解釋:" + bjSdf.format(bjDate) + ", " + bjDate.getTime());SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 東京 tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo")); // 設(shè)置東京時(shí)區(qū) Date tokyoDate = tokyoSdf.parse(timeStr); // 解析 System.out.println("字面時(shí)間: " + timeStr +",按東京時(shí)間來(lái)解釋:" + tokyoSdf.format(tokyoDate) + ", " + tokyoDate.getTime());

輸出為:
字面時(shí)間: 2017-8-24 11:17:10,按北京時(shí)間來(lái)解釋:2017-08-24 11:17:10, 1503544630000
字面時(shí)間: 2017-8-24 11:17:10,按東京時(shí)間來(lái)解釋:2017-08-24 11:17:10, 1503541030000
可以看出,對(duì)于"2017-8-24 11:17:10"這個(gè)字符串,按北京時(shí)間來(lái)解釋得到Date對(duì)象的毫秒數(shù)是
1503544630000;而按東京時(shí)間來(lái)解釋得到的毫秒數(shù)是1503541030000,前者正好比后者大于3600000毫秒即1個(gè)小時(shí),正好是北京時(shí)間和東京時(shí)間的時(shí)差。這很好理解,北京時(shí)間2017-08-24 11:17:10對(duì)應(yīng)的毫秒數(shù)是1503544630000,而東京時(shí)間2017-08-24 11:17:10對(duì)應(yīng)的北京時(shí)間其實(shí)是2017-08-24 10:17:10(因?yàn)楸本r(shí)間比東京時(shí)間晚1個(gè)小時(shí)),北京時(shí)間2017-08-24 10:17:10自然比北京時(shí)間2017-08-24 11:17:10少3600000毫秒。

4.將字符串表示的時(shí)間轉(zhuǎn)換成另一個(gè)時(shí)區(qū)的時(shí)間字符串
綜合以上分析,如果給定一個(gè)時(shí)間字符串,并告訴你這是某個(gè)時(shí)區(qū)的時(shí)間,要將它轉(zhuǎn)換為另一個(gè)時(shí)區(qū)的時(shí)間并輸出,正確的做法是:
1.將字符串按原時(shí)區(qū)轉(zhuǎn)換成Date對(duì)象;
2.將Date對(duì)象格式化成目標(biāo)時(shí)區(qū)的時(shí)間。
比如,將北京時(shí)間"2017-8-24 11:17:10"輸出成東京時(shí)間,代碼為:

String timeStr = "2017-8-24 11:17:10"; // 字面時(shí)間 SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); Date date = bjSdf.parse(timeStr); // 將字符串時(shí)間按北京時(shí)間解析成Date對(duì)象SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 東京 tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo")); // 設(shè)置東京時(shí)區(qū) System.out.println("北京時(shí)間: " + timeStr +"對(duì)應(yīng)的東京時(shí)間為:" + tokyoSdf.format(date));

輸出為:
北京時(shí)間:2017-8-24 11:17:10對(duì)應(yīng)的東京時(shí)間為:2017-08-24 12:17:10

總結(jié)

以上是生活随笔為你收集整理的Java中的时区转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。