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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 夏令时jvm设置问题

發(fā)布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 夏令时jvm设置问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關于上一篇https://blog.csdn.net/u011165335/article/details/78924498
介紹了中國以及美國等的夏令時的特點:
*1.夏令時在結束的時間點是不會突變的
*2.通過代碼可以知道實際的夏令時時間段比 宣傳的少一個小時
系統(tǒng)時區(qū)在:注冊表
計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\China Standard Time

先回顧一下之前的6個突變點:
環(huán)境jdk6

package com.ysy;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.Properties; import java.util.TimeZone;import org.junit.Test;public class Demo {// 比如1986年的夏令時時間,從代碼來看,是從1986-05-04 00:00:001986-09-13 22:59:59@Testpublic void test4() throws Exception {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));TimeZone zone = TimeZone.getDefault();System.out.println(zone);Date d12 = sf.parse("1986-05-03 23:59:00");//Date d13 = sf.parse("1986-05-04 00:00:00");//Date d14 = sf.parse("1986-06-04 00:00:00");//Date d15 = sf.parse("1986-09-13 22:59:59");//Date d16 = sf.parse("1986-09-13 23:00:00");//Date d21 = sf.parse("1987-04-11 23:59:00");//Date d22 = sf.parse("1987-04-12 00:00:00");//Date d23 = sf.parse("1987-09-12 22:59:59");//Date d24 = sf.parse("1987-09-12 23:00:00");//Date d31 = sf.parse("1988-04-09 23:59:59");//Date d32 = sf.parse("1988-04-10 00:00:00");//Date d33 = sf.parse("1988-09-10 22:59:59");//Date d34 = sf.parse("1988-09-10 23:00:00");//System.out.println("===============");Date d41 = sf.parse("1989-04-15 23:59:59");//Date d42 = sf.parse("1989-04-16 00:00:00");//Date d43 = sf.parse("1989-09-16 22:59:59");//Date d44 = sf.parse("1989-09-16 23:00:00");//System.out.println("===============");Date d51 = sf.parse("1990-04-14 23:59:59");//Date d52 = sf.parse("1990-04-15 00:00:00");//Date d53 = sf.parse("1990-09-15 22:59:59");//Date d54 = sf.parse("1990-09-15 23:00:00");//System.out.println("===============");Date d61 = sf.parse("1991-04-13 23:59:59");//Date d62 = sf.parse("1991-04-14 00:00:00");//Date d63 = sf.parse("1991-09-14 22:59:59");//Date d64 = sf.parse("1991-09-14 23:00:00");//System.out.println("=========1986=======");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d12));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d13));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d14));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d15));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d16));System.out.println("=========1987=======");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d21));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d22));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d23));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d24));System.out.println("=========1988=======");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d31));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d32));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d33));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d34));System.out.println("=========1989=======");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d41));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d42));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d43));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d44));System.out.println("=========1990=======");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d51));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d52));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d53));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d54));System.out.println("======1991==========");System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d61));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d62));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d63));System.out.println("目標時區(qū)是否使用了夏令時:" + isDaylight(zone, d64));// 6個突變點如下,只在開始實行的時候變化System.out.println("===1986-05-04 00:00:00實際時間=====" + sf.parse("1986-05-04 00:00:00").toLocaleString());System.out.println("===1987-04-12 00:00:00實際時間=====" + sf.parse("1987-04-12 00:00:00").toLocaleString());System.out.println("===1988-04-10 00:00:00實際時間=====" + sf.parse("1988-04-10 00:00:00").toLocaleString());System.out.println("===1989-04-16 00:00:00實際時間=====" + sf.parse("1989-04-16 00:00:00").toLocaleString());System.out.println("===1990-04-15 00:00:00實際時間=====" + sf.parse("1990-04-15 00:00:00").toLocaleString());System.out.println("===1991-04-14 00:00:00實際時間=====" + sf.parse("1991-04-14 00:00:00").toLocaleString());}// 判斷是否在夏令時private boolean isDaylight(TimeZone zone, Date date) {// 正常邏輯是:時區(qū)使用了夏令時再判斷時間,這里因為中國取消了if (zone.getID().equals("Asia/Shanghai")) {return zone.inDaylightTime(date);}return zone.useDaylightTime() && zone.inDaylightTime(date);}}

可以知道,目前就6個時間點發(fā)生加1個小時的變化:
1986-05-04 00:00:00實際時間=====1986-5-4 1:00:00
1987-04-12 00:00:00實際時間=====1987-4-12 1:00:00
1988-04-10 00:00:00實際時間=====1988-4-10 1:00:00
1989-04-16 00:00:00實際時間=====1989-4-16 1:00:00
1990-04-15 00:00:00實際時間=====1990-4-15 1:00:00
1991-04-14 00:00:00實際時間=====1991-4-14 1:00:00
上面出現(xiàn),這種情況,說明系統(tǒng)的時區(qū)是Asia/Shanghai
那么如果不讓時間變化?
java.util.TimeZone類中getDefault方法的源代碼顯示,它最終是會調用sun.util.calendar.ZoneInfo類的getTimeZone 方法。這個方法為需要的時間區(qū)域返回一個作為ID的String參數(shù)。這個默認的時間區(qū)域ID是從 user.timezone (system)屬性那里得到。如果user.timezone沒有定義,它就會嘗試從user.country和java.home (System)屬性來得到ID。 如果它沒有成功找到一個時間區(qū)域ID,它就會使用一個”fallback” 的GMT值。換句話說, 如果它沒有計算出你的時間區(qū)域ID,它將使用GMT作為你默認的時間區(qū)域。
win對應jre\lib\zi
所以最關鍵的是設置好user.timezone即可;
如何設置,可以通過jvm參數(shù)設置或者System.setProperty

查看user.timezone
System.out.println(System.getProperty(“user.timezone”));
在jdk6,7輸出的時區(qū)是空的;jdk8的user.timezone可以直接獲取到系統(tǒng)時區(qū);

所以只要在jvm設置 -Duser.timezone=GMT+8就可以了;
但是如果有多臺服務器,一個設置了GMT+8,一個沒設置,還是原來的Asia/Shanghai;那么2臺機子的時間傳輸會發(fā)生時間的轉換;

下面說的是模擬這種轉換:

情況1:win系統(tǒng)的默認時區(qū)為Asia/Shanghai;
然后你設置了TimeZone.setDefault(TimeZone.getTimeZone(“GMT+8”));類似你在jvm設置了GMT+8
那么現(xiàn)在一個時間 比如1990-04-17 00:00:00 ,這個時間正處在夏令時時間;
當你設置了GMT+8時區(qū)后,它認為正確的顯示時間應該是減一個小時,即1990-04-16 23:00:00;
怎么證明?
你可以在截圖的里面,把VM參數(shù)該為: -Duser.timezone=Asia/Shanghai
然后設置TimeZone.setDefault(TimeZone.getTimeZone(“GMT+8”)),
即可以印證;

===在夏令時1986-05-18 00:00:00實際時間=====1986-5-17 23:00:00
===在夏令時1987-06-17 00:00:00實際時間=====1987-6-16 23:00:00
===在夏令時1988-07-14 00:00:00實際時間=====1988-7-13 23:00:00
===不在夏令時1988-09-11 00:00:00實際時間=====1988-9-11 0:00:00

同理情況2:如win系統(tǒng)的默認時區(qū)為GMT+8;
然后你設置了TimeZone.setDefault(TimeZone.getTimeZone(“Asia/Shanghai”));
那么現(xiàn)在一個時間,比如1990-04-17 00:00:00,這個時間對于GMT+8而言,沒有夏令時概念;
當你設置了Asia/Shanghai這個時區(qū)后,(相當于帶有夏令時的東八區(qū)),此時會加一個小時,因為對于Asia/Shanghai而言,剛好在夏令時時間內(nèi)! 于是實際顯示為:1990-04-17 01:00:00;
這里代碼演示如下:

這里假設win系統(tǒng)的默認時區(qū)為GMT+8; private void test() throws ParseException {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));TimeZone zone = TimeZone.getDefault();System.out.println(zone);// 夏令時開始時間System.out.println("===1986-05-04 00:00:00實際時間=====" + sf.parse("1986-05-04 00:00:00").toLocaleString());System.out.println("===1987-04-12 00:00:00實際時間=====" + sf.parse("1987-04-12 00:00:00").toLocaleString());System.out.println("===1988-04-10 00:00:00實際時間=====" + sf.parse("1988-04-10 00:00:00").toLocaleString());System.out.println("===1989-04-16 00:00:00實際時間=====" + sf.parse("1989-04-16 00:00:00").toLocaleString());System.out.println("===1990-04-15 00:00:00實際時間=====" + sf.parse("1990-04-15 00:00:00").toLocaleString());System.out.println("===1991-04-14 00:00:00實際時間=====" + sf.parse("1991-04-14 00:00:00").toLocaleString());// 夏令時結束時間System.out.println("===1986-09-13 23:00:00實際時間=====" + sf.parse("1986-09-13 23:00:00").toLocaleString());System.out.println("===1987-09-12 23:00:00實際時間=====" + sf.parse("1987-09-12 23:00:00").toLocaleString());System.out.println("===1988-09-10 23:00:00實際時間=====" + sf.parse("1988-09-10 23:00:00").toLocaleString());System.out.println("===1989-09-16 23:00:00實際時間=====" + sf.parse("1989-09-16 23:00:00").toLocaleString());System.out.println("===1990-09-15 23:00:00實際時間=====" + sf.parse("1990-09-15 23:00:00").toLocaleString());System.out.println("===1991-09-14 23:00:00實際時間=====" + sf.parse("1991-09-14 23:00:00").toLocaleString());上面是已知的夏令時開始和結束時間打印下面幾個時間:System.out.println("===在夏令時1986-05-18 00:00:00實際時間=====" + sf.parse("1986-05-18 00:00:00").toLocaleString());System.out.println("===在夏令時1987-06-17 00:00:00實際時間=====" + sf.parse("1987-06-17 00:00:00").toLocaleString());System.out.println("===在夏令時1988-07-14 00:00:00實際時間=====" + sf.parse("1988-07-14 00:00:00").toLocaleString());System.out.println("===不在夏令時1988-09-11 00:00:00實際時間=====" + sf.parse("1988-09-11 00:00:00").toLocaleString());}

可以發(fā)現(xiàn):跟預測的一樣,在夏令時的加1,不在的不變
===在夏令時1986-05-18 00:00:00實際時間=====1986-5-18 1:00:00
===在夏令時1987-06-17 00:00:00實際時間=====1987-6-17 1:00:00
===在夏令時1988-07-14 00:00:00實際時間=====1988-7-14 1:00:00
===不在夏令時1988-09-11 00:00:00實際時間=====1988-9-11 0:00:00

情況3:如win系統(tǒng)的默認時區(qū)為GMT+8;
然后你設置了TimeZone.setDefault(TimeZone.getTimeZone(“GMT+8”));那么時區(qū)一致,時間不會變化;

上面演示的就是類似2臺機子時區(qū)不一致的情況;
jvm設置對機子的設置是可以直接修改user.timezone,沒問題的;
讓多臺機子保持統(tǒng)一就可以了;

如果是linux,也可以修改clock文件;

總結

以上是生活随笔為你收集整理的java 夏令时jvm设置问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 久操视频免费在线观看 | 国产精品无码在线 | 欧美 国产 精品 | 精品视频无码一区二区三区 | 免费的黄色片 | 乱lun合集小可的奶水 | 男人添女人荫蒂国产 | 色黄大色黄女片免费中国 | aaa人片在线 | 久久久国 | 熟女丝袜一区 | 激情av在线播放 | 成人软件在线观看 | 伊人久久九 | 一级黄色大片免费 | 少妇又色又爽又黄的视频 | 后入内射欧美99二区视频 | www.久久99| 日韩黄色精品视频 | 国产一级片a | 性久久久久 | 国产手机视频在线 | 理论片中文字幕 | 成人在线短视频 | 中国一级特黄毛片 | 中国美女一级看片 | 国产毛片一区二区三区 | 91伊人久久 | 亚洲av综合色区无码一区 | 在线免费观看污 | 台湾一级视频 | 99精品视频在线 | 神马午夜一区 | 四虎福利 | 人妻偷人精品一区二区三区 | 91在线观看免费高清完整版在线观看 | 免费久久久久久 | 色婷婷狠狠操 | 国产一二在线观看 | 成人av在线网 | 黑巨茎大战欧美白妞 | 视频一区国产 | 久久高清无码视频 | 欧美日本高清 | 亚洲天堂第一区 | 精品麻豆| 国产精品.www | 成人做爰www看视频软件 | 欧美精品一线 | 国产精品二 | 神马午夜在线观看 | 曰本毛片| 女人喷潮完整视频 | 1级av| 青青草国内自拍 | 欧美黄色一级视频 | 国产精品久久婷婷六月丁香 | 国内精品毛片 | 欧美最猛性xxxx | 亚洲美女免费视频 | 91爱啪啪 | 日本精品视频一区 | 色综合狠狠 | 在线观看www. | 玖玖玖在线观看 | 黄色成年人网站 | 乱亲女h秽乱长久久久 | 在线观看一区二区视频 | 亚洲精品视频一区 | 久久成人午夜 | 超黄网站在线观看 | 婷婷av一区二区三区 | 99精品视频播放 | 91成人免费看片 | av色成人 | 欧美性受xxxxxx黑人xyx性爽 | 日韩不卡一区二区三区 | 日本精品久久久久久 | 性日本xxx | 亚洲伦理精品 | 黄网免费观看 | 国产盗摄视频在线观看 | av国产在线观看 | 成人爱爱视频 | 久久久久久综合 | 精品一区亚洲 | 超碰成人av | 国产成人一区二区三区视频 | 艳妇臀荡乳欲伦交换gif | 在线天堂av | 性一区 | 日韩特级黄色片 | 制服诱惑一区二区三区 | www视频在线观看 | 日韩成人一级 | 天天综合网天天综合 | 欧美高清大白屁股ass18 | 青草99| 精品国产av色一区二区深夜久久 |