[Java] なぜ、これらの2つの時間を(1927年に)減算して、奇妙な結果が得られたのですか?



Answers

現地時間の不連続が発生しました:

地元の標準時が日曜日に近づいていたとき、1 1. 1928年1月、00:00:00の時計は0:05:52時間土曜日、31. 12月、1927年12月23:54:08

これは特に奇妙なことではなく、政治的行為や行政的行為のためにタイムゾーンが変更または変更されたときに、いつでもどこでも起こりました。

Question

次のプログラムを実行すると、1秒間隔で参照する2つの日付文字列を解析し、それらを比較します。

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-ld31はないのですか(私はld4-ld3の1秒差から期待していますが) 353ですか?

1秒後に日付を変更する場合:

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

するとld4-ld31ます。

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に変換してから加算または減算する必要があります。 現地時間は表示にのみ使用してください。

このようにして、時間や分が2回起こる任意の期間を歩くことができます。

UTCに変換した場合は、1秒ごとに追加し、現地時間に変換して表示します。 11:54:08 pm LMT - 11:59:59 pm LMT、次に11:54:08 pm CST - 11:59:59 pm CSTになります。




IMHO Javaにおける普遍的な暗黙的なローカライゼーションは、その最大の単一の設計上の欠陥です。 これは、ユーザインタフェースを意図しているかもしれませんが、現実にはプログラマがターゲットとすることができないため、現実にはローカライゼーションを無視できるIDEを除いて、今日は本当にJavaをユーザインタフェースに使用しています。 あなたはそれを修正することができます(特にLinuxサーバで):

  • エクスポートLC_ALL = C TZ = UTC
  • システムクロックをUTCに設定する
  • 絶対に必要な場合を除いて、ローカライズされた実装を使用しないでください(つまり、表示のみ)

Java Community Processのメンバーには、次のことをお勧めします。

  • ローカライズされたメソッドをデフォルトではなく、ユーザーに明示的にローカライゼーションを要求する必要があります。
  • UTF-8 / UTCを代わりにFIXEDデフォルトとして使用してください。 このようなスレッドを生成したい場合を除いて、何か他のことをする理由はありません。

私は、グローバルな静的変数は反OOパターンではない、ということですか? いくつかの基本的な環境変数によって与えられたそれらの普及したデフォルトは他にありません.......




申し訳ありませんが、時間の不連続が少し動いています

JDK 6は 2年前、 JDK 7では最近更新25になっています。

学習する授業:UTC以外の時間は、多分、表示することを除いて、すべての費用で避けてください。




Links