2012-01-18 4 views
8

はい、JavaとJavascriptのDateに関する別の質問です。Javascriptの日付とjava.util.Dateのコンストラクタ引数

タイムゾーンは、Javaとブラウザ(Chrome)の両方でGMT + 4(モスクワ)です。

<script language="javascript"> 
    var d = new Date(170798400000); 
    document.write(d); 
</script> 

は与える:日1975年6月1日00:00:00 GMT + 0400(ロシア標準時)

public class Test { 
    public static void main(String[] args) { 
     java.util.Date d = new java.util.Date(170798400000L); // the same epoch value! 
     System.out.println(d); 
    } 
} 

は与える:土5月31日23時00分○○秒MSK 1975

をした場合エポック値を2011年から2012年のようなものに変更します(ロシアで夏時間がキャンセルされた後)出力はOKです。タイムゾーンアップデータツールが正常に実行されました。

これはバグですか?これは文書化された機能ですか? YHYY-MM-dd HH:mm:SS程度のような書式設定と再解析以外の方法はありますか?のJavadocから

すなわち

はDateオブジェクトを割り当て、「エポック」として知られている標準ベースの時間からのミリ秒の指定された数を表すために、それを初期化する(長い日付)

日1月1日、1970、00:00:00 GMT。

javascriptの参照から:

新しい日付(ミリ秒)

ミリ秒 - 1970年1月1日00:00:00(UNIXのエポック)からのミリ秒数を表す整数値。

+0

これは「タイムゾーンの変更」と関連があるかもしれません。http://en.wikipedia.org/wiki/Moscow_Time –

+0

これは間違いありません。それは、DateコンストラクタがJavaScriptでもう使用できないことを意味しますか? – ike3

+0

そのうちの1人が正しい答えを出しているが、他の人が答えていない場合は、もう1つはバグを持っていると言うでしょう:-) Javaは正しいかJavaScriptですか?私はソートのJavaバージョンが正しい答えを与えることを期待していますが、それは単なる疑いです。 – Pointy

答えて

1

これはバグですか?これは文書化された機能ですか?

これはJavascriptのバグではありません。少なくとも、私はそれを主張することはできません。

ブラウザのJavascriptエンジンが「GMT + 4」に変換された時刻を返しています。明らかに、GMT + 4とは違うMSKです(あなたのコメントに記載されています)。 MSKについて知らないJavascriptはバグとしてカウントされませんが、機能が不足しています。多分、jsはタイムゾーンの詳細な知識を持っていないのは間違っているが、バグではない。

YYYY-MM-dd HH:mm:SS程度のような書式設定と再解析を除いて、これを処理する方法はありますか?

タイムゾーンの任意の詳細すべてを追跡するには、多くの作業が必要です。私はjavascriptのために利用できるすべてのコードベースを知っていません。したがって、本当のMSKを使いたい場合は、手動でその変換を手動でコーディングする必要があります。

1

人間の場合、時間の文字列表現("Sun Jun 01 1975 00:00:00 GMT+0400"など)が使用されます。保存と計算には時間値(1970年1月1日以降のミリ秒)が使用されます。

バグはありません。 JavaScriptでは、仕様に従って、文字列表現の内容は実装依存です。Javaでは、ドキュメントによれば、夏時間に反映される可能性があります。 JavaScript specificationから

15.9.5.2 Date.prototype.toString ()

この関数は、文字列値を返します。 Stringの内容はimplementation-> dependentですが、現在のタイムゾーンの日付を人間が読める形式で簡潔に表現することを意図しています。

Java documentationから

java.util.Date, public String toString() 

Converts this Date object to a String of the form: dow mon dd hh:mm:ss zzz yyyy 

where: 
... 
zzz is the time zone (and may reflect daylight saving time).` 
0

TL; DR

Instant.ofEpochMilli(170_798_400_000L) 

1975-05-31T20:00:00Z

...と...

Instant.ofEpochMilli(170_798_400_000L) 
     .atZone(ZoneId.of("Europe/Moscow")) 

1975-05-31T23:00 + 03:00 [ヨーロッパ/モスクワ]

live codeを参照してください。現代的なアプローチは、Java 8でjava.timeクラスを使用し、後でjava.time

を使用して

あなたは現在、レガシーなJavaで面倒な古い日時クラスを使用しています。これらのクラスの多くの問題の中には、文字列を生成しているときに現在のデフォルトタイムゾーンを適用するという、善意ではあるが混乱する機能がありました。内部値は実際には常にUTCですが、toStringは実際にはそうでない場合はDateにタイムゾーンがあるという錯覚を作り出します。それはあなたのMSKの謎を説明しています。

[はに深く埋め込まれたですが、この説明とは無関係です。それらの古いDate/Calendarクラスはひどい混乱です。幸いにも、Javaはどのプラットフォームでも最高クラスの日時フレームワークを持っています:java.time。]

あなたの入力は、1970-01-01T00:00:00ZのUnixエポックタイムからのミリ秒数を表しているようです。

Instantクラスは、nanoseconds(小数点以下9桁まで)の解像度を持つUTCのタイムライン上の瞬間を表します。このクラスは入力番号を直接解析できます。

Instant instant = Instant.ofEpochMilli(170_798_400_000L) ; 

instant.toString():1975-05-31T20:00:00Zあなたが特定の地域のwall-clock timeのレンズを通してその同じ瞬間を見たい場合は

は、時間を適用ゾーン。ZoneIdを適用してZonedDateTimeオブジェクトを取得します。

ZoneId z = ZoneId.of("Europe/Moscow") ; 
ZonedDateTime zdt = instant.atZone(z) ; 

1975-05-31T23:00 + 03:00 [ヨーロッパ/モスクワ]

間違っていたJavaScriptライブラリ

あなたの呼び出しの結果のJavaScriptライブラリにありますオフセットが+04:00で間違っています。 According to Wikipedia、1930年から1981年のモスクワ時間は3時間前、+ 03:00でした。 java.timeフレームワークでは、1975年に+03:00の正しい結果が得られます。詳細はTime in Russiaを参照してください。警告:私はロシア/ソ連時代の専門家ではない。 java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8Java SE 9、以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • のJava 9は、いくつかのマイナーな機能と修正が追加されます。
  • Java SE 6Java SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題