java 夏令时标志_Java里面的夏令时 | 学步园
內容來自論壇的文章:http://topic.csdn.net/u/20090711/01/82c73f46-20ac-4a95-977d-f3f077ce822a.html
如下的java代碼
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS");
String sTime = "1991-04-07 00:00:00";
Date time = sdf.parse(sTime);
Calendar cd = Calendar.getInstance();
cd.setTime(time);
cd.add(Calendar.DATE, 7);
time = cd.getTime();
System.out.println(sdf.format(time));
在運行后,沒有得到預期的
1991-04-14 00:00:00
而是
1991-04-14 01:00:00
憑空多出來了1小時
根據火龍果的研究成果,這個是夏令時哦,使用 Calendar.DST_OFFSET 可以獲得偏移量。
夏令時是通過 TimeZone 的子類 sun.util.calendar.ZoneInfo 實現的。
ZoneInfo 中的數據存放于 %JRE_HOME%/lib/zi 目錄中。
我們機器一般采用的時區名稱為 Asia/Shanghai,相對應的時區信息文件位于:
%JRE_HOME%/lib/zi/Asia/Shanghai 中,這是一個二進制文件。
通過 sun.util.calendar.ZoneInfoFile 的解析,可以獲得需要采用夏令時的時間為:
Java code
1940
-
06
-
03
01
:
00
:
00
~
1940
-
09
-
30
23
:
00
:
00
1941
-
03
-
16
01
:
00
:
00
~
1941
-
09
-
30
23
:
00
:
00
1986
-
05
-
04
01
:
00
:
00
~
1986
-
09
-
13
23
:
00
:
00
1987
-
04
-
12
01
:
00
:
00
~
1987
-
09
-
12
23
:
00
:
00
1988
-
04
-
10
01
:
00
:
00
~
1988
-
09
-
10
23
:
00
:
00
1989
-
04
-
16
01
:
00
:
00
~
1989
-
09
-
16
23
:
00
:
00
1990
-
04
-
15
01
:
00
:
00
~
1990
-
09
-
15
23
:
00
:
00
1991
-
04
-
14
01
:
00
:
00
~
1991
-
09
-
14
23
:
00
:
00
前段表示那一天開始的時間,也就是說那一天的 0 點在該時區中是不存在。
后段表示那一天結束的時間,這個時間計算很復雜:
如果當前時間為:1986-09-13 23:00:00,增加 1 小時后為 1986-09-14 00:00:00
如果當前時間為:1986-09-13 22:00:00,增加 2 小時后為 1986-09-13 23:00:00,因為 1986-09-13 23:00:00 是夏令時結束時間,時鐘需要回撥。
由于每個時區的夏令時都不一樣,
幸好中國從 1992 年開始停止使用夏令時。
總結
以上是生活随笔為你收集整理的java 夏令时标志_Java里面的夏令时 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片放大神器: waifu2x
- 下一篇: canvas上纯JS实现可滑动时间刻度轴