2

ブラジリア GMT -0300: DST が 2012 年 10 月 21 日の 00:00:00 であると仮定すると、時計を 1 時間進める必要があります。

ジャワ

new Date(2012 - 1900, 9, 21, 0, 0, 0)
Sun Oct 21 01:00:00 BRST 2012

Chrome/FireFox (コンソール)

new Date(2012, 9, 21, 0, 0 ,0)
Sat Oct 20 2012 23:00:00 GMT-0300 (Hora oficial do Brasil)

Java での結果は私が期待していたものですが、JS での結果は理解できません。ビョルンドが言うこの投稿を見つけました

これは完全に正しい動作です

しかし、なぜこの振る舞いがOKなのかは説明していません。

私の質問は:

JS が 1 時間前の日付を返すのはなぜですか?

PS Date が「非推奨」としてマークされていることは知っていますが、GWT を使用しています。日付は私の唯一のオプションです。

4

1 に答える 1

2

基本的に、私が見る限り、その答えは正しくありませんでした。私はJavaバージョンに完全に満足しているわけではありません。

基本的に、あなたは決して起こらなかったローカルの日付/時刻を構築しようとしています。現地時間からUTCへの変換は、次の3つの可能性があるため、常に注意が必要です。

  • 明確なマッピング。これは、ほとんどのタイムゾーンで、1年に2時間を除くすべての場合に当てはまります。
  • 同じ現地時間が2回発生する、逆方向遷移中のあいまいなマッピング(たとえば、現地時間が12:59 am、1am、... 1:59 am、1am、1:59am、2amになります)
  • 「ギャップ」マッピング。現地時間は単に存在しません(たとえば、現地時間は午前12時59分、午前2時、午前2時1分になります)。

ブラジルは深夜に時計を進めているため、現地時間は実際には次のようになります。

October 20th 11:58pm
October 20th 11:59pm
October 21st 01:00am
October 21st 01:01am

あなたが求めた現地時間は決して起こりませんでした。Javaはあなたがそれをロールフォワードしたいと思っているようです...一方JavaScriptは混乱しています:(2013年2月16日の初めに真夜中を求めていた場合、JavaScriptの結果はより理解しやすくなります(しかしそれでも正しくありません)例-時計が15日の午後11時に戻った場合。16日の午前12時は、15日の「2番目の」午後11時から午後11時59分以降にのみ発生する可能性があるため、明確です。

良い日付/時刻API(私の非常に偏った見方では)は、変換を行うときにあいまいさやギャップをどのように発生させたいかを言うことを強制します。

于 2012-10-24T11:37:51.247 に答える