date時區 java 為什麼減去這兩次(在1927年)給出一個奇怪的結果?



4 Answers

您遇到了當地時間不連續

當地標準時間即將到達星期日時,1928年1月1日00:00:00時鐘倒退0:05:52到星期六,31。1927年12月31日,當地標準時間23:54:08

這並不是特別奇怪,並且由於政治或行政行為導致時區被切換或改變,因此在任何時候都發生過這種情況。

java timezone

如果我運行以下程序,它解析引用時間間隔為1秒的兩個日期字符串並比較它們:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

輸出是:

353

為什麼ld4-ld3不是1 (正如我所預期的那樣,時間ld4-ld3 1秒),但353

如果我將日期更改為1秒後的時間:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";  

然後ld4-ld3將為1

Java版本:

java version "1.6.0_22"
Java(TM) SE Runtime Environment (build 1.6.0_22-b04)
Dynamic Code Evolution Client VM (build 0.2-b02-internal, 19.0-b04-internal, mixed mode)

Timezone(`TimeZone.getDefault()`):

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]

Locale(Locale.getDefault()): zh_CN



增加時間時,您應該轉換回UTC然後加或減。 僅使用當地時間進行顯示。

通過這種方式,您可以在幾小時或幾分鐘發生兩次的任何時段走過。

如果您轉換為UTC,請添加每秒,然後轉換為本地時間進行顯示。 你可以通過下午11:54:08 LMT - 美國中部時間晚上11:59:59和美國中部時間晚上11:59:59。




我很遺憾地說,但是時間的不連續性已經發生了變化

兩年前的JDK 6 ,以及最近在更新25中的JDK 7

需要學習的經驗:不惜一切代價避免非UTC時間,可能用於顯示。




恕我直言,Java中普遍存在的隱式本地化是其最大的單一設計缺陷。 它可能適用於用戶界面,但坦率地說,今天誰真正使用Java作為用戶界面,除了一些IDE,你基本上可以忽略本地化,因為程序員並不完全是它的目標受眾。 您可以通過以下方式修復它(特別是在Linux服務器上):

  • export LC_ALL = C TZ = UTC
  • 將系統時鐘設置為UTC
  • 除非絕對必要,否則永遠不要使用本地化的實現

對於Java Community Process成員,我建議:

  • 使本地化方法不是默認方法,但要求用戶明確請求本地化。
  • 使用UTF-8 / UTC作為FIXED默認值,因為這只是今天的默認值。 除非您想生成這樣的線程,否則沒有理由做其他事情。

我的意思是,來吧,不是全局靜態變量是反OO模式嗎? 沒有其他東西是由一些基本環境變量給出的普遍違約.......






Related