0

私はブラジル出身で、Javascript でこのコードを書きました。

var dt = new Date(2012,9,21);   // Oct-21-2012
alert(dt.getDate());

ただし、21 ではなく 20 が生成されます。Firefox 18、Chrome 24、および Internet Explorer 8 でテストしました。

それはどのように可能ですか?

4

1 に答える 1

2

あなたは大きな偶然に出会いました。

ブラジルでは、2012 年 10 月 21 日がほとんどの国の夏時間の開始日であるため、2012 年 10 月 21 日 0:0 と 1:0 の間のローカル日付はブラジルには存在しません。

他の国の一部の人々は、同じ日に同じ問題に直面していませんでした.

参照: http://www.timeanddate.com/news/time/brazil-dst-2012.html

ブラジルでは、質問内のコードは実際に 20 を出力します

var dt = new Date(2012,9,21);  // 21-Oct-2012 0:0
alert(dt.getDate());

ただし、失われた時間を「飛び越える」には 1 時間あれば十分であるため、わずかな変更で 21 が生成されます。

var dt = new Date(2012,9,21,1);  // 21-Oct-2012 1:00
alert(dt.getDate());

参照: http://www.timeanddate.com/time/dst/2013.html

コメント後に編集:たとえば、米国では、2013 年 3 月 10 日に夏時間が開始されます。

var dt = new Date(2013,02,10);  // March-10-2013
alert(dt.getDate());    // Output: 10

なぜそれが正しいのですか?米国では夏時間はブラジルのように 0:00 ではなく 2:00 にジャンプするため、暗黙の 0 時間は生成された日付を問題から保護します。 -/-

ブラジルでは、時間に関係なく日付を扱う多くのサイトでバグが発生する状況です。フォームに日付を入力すると、経過日数を計算するアルゴリズムが間違った方法で計算される可能性があります。

たとえば、誰かがこの素敵な JavaScript コードを使用してフォーム ( DHML Goodies Calendar ) に日付を入力し、その日付をデータベースに保存することを決定した後、運が悪ければ間違った日付を取得する可能性があります。特別な日に会うために。

最終的な解決策は、UTC (協定世界時) 時間を使用することです。これは、夏時間の変更がなく、一種の抽象的な時間を使用するためです。ほとんどの実用的なアプリケーションでは問題ありません。

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

UTC を使用する代わりに、誰かが時間、分、秒を使用しない場合は、上記で示したように、Date() 呼び出しに 1 以上のダミーの時間値を入れるだけで簡単です。

コメントの後に編集:したがって、ブラジル (およびイラン、レバノン、パラグアイ、チリ、ポルトガルなどの国) は、この混乱を回避し、より多くのものに合わせるために、夏時間の開始を 0:00 ではなく 2:00 に変更する必要があります。先進国。 -/-

于 2013-02-19T02:37:07.187 に答える