52

次のスクリプトは、21 ではなく 20 を返します。

var d = new Date("2010/03/21");
document.write(d.getDate());

私は何を間違っていますか?これは JavaScript のバグですか?

4

12 に答える 12

63

Date.parseメソッドは実装に依存します (はnew Date(string)と同等ですDate.parse(string))。

この形式は最新のブラウザーで使用できますが、ブラウザーが目的の形式を正確に解釈することを 100% 保証することはできません。

文字列を操作し、年、月、日の引数で Date コンストラクターを使用することをお勧めします。

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}
于 2010-03-21T19:11:43.737 に答える
34

Date()は現地時間を使用するため、これは夏時間の問題です。

私はブラジルに住んでおり、2012 年 10 月 21 日は私の国のほとんどの国で夏時間の開始日です。そのため、ブラジルには 2012 年 10 月 21 日から 0:0 と 1:0 の間のローカル日付は存在しません。

ここで、うまくいくとコメントする人もいます。これは、適切な時間の戻り値または間違った時間の戻り値がローカル ユーザーの国に依存するために発生します。

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

ブラジルでは、2012 年に Java は DST が 10 月 14 日に始まると考えています (実際には 1 週間後に開始されます)。

var dt = new Date(2012,9,14); 
alert(dt.getHours());

1を生成し、

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

解決策は、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() );

上で示したように、誰かが時間、分、秒を使用せずに、1 以上のダミーの時間値を配置する方が簡単です。

于 2013-02-06T22:45:52.653 に答える
16

文字列引数を UTC として処理し、結果のDateオブジェクトを現地時間として処理する可能性はありますか、またはその逆ですか? それはそれを捨てる可能性があります。と比較d.getDate()してくださいd.getUTCDate()

于 2010-03-21T19:23:44.537 に答える
4

また、から1日の偏差がありますが、これは期待値を返すgetDate()ことに注意してください。getUTCDate()この問題はFF3.6.12で見られましたが、Chromeで実行されている同じコードで問題ありませんでした。

私のデバッグコード:

var date="2010-11-04";
alert(date);
var d = new Date(date)
alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());

これにより、出力(FireFox)が得られました。

2010年11月3日水曜日:3 UTC 4

Chromeは問題ありません。したがって、どこかで何かが起きています-おそらくバグですが、タイムゾーン/UTCパラメータの問題である可能性が高いです。タイムゾーンがその日に変更された場合など、PHPが1日に23時間戻る場所を思い出させdate()ます。ただし、それが何であるかを知っていると、バグが発生します。

于 2010-11-23T20:07:52.917 に答える
2

ブラウザのアドレスバーに次のコードを書いたところ、結果は21

javascript:alert(new Date("2010/03/21").getDate())

Javascript のバグなどはありません。Javascript の実装は多数あるため、特定の実装を参照する必要があります。

私がテストした実装は Chrome 4.1.249 でした。君は?

于 2010-03-21T19:09:19.347 に答える
1

このコードを Firefox 3.6 と IE 8 でテストしました。

<script type="text/javascript">

var d = new Date("2010/03/21");
document.write(d.getDate());

</script> 

正しい日付が表示されています: 21

詳細については、以下を参照してください: JavaScript Date オブジェクト

ウィキペディアでJavaScript の互換性に関する考慮事項についても読むことができます。

于 2010-03-21T19:09:15.603 に答える
0

文字列「2010/03/21」または整数の日付引数(2010,2,21)のどちらを使用しても、firfox、safari、chrome、opera、およびIEで同じ日付(21)を取得します。

私はWindowsマシンと新しいバージョンのブラウザを使用しています-

クライアントが文字列とは異なる日付を解析するかどうかをテストして確認できます。これは、問題が発生した唯一の場所です。

if(new Date("2010/03/21")- new Date(2010,2,21)){
alert(new Date("2010/03/21"));
} 
于 2010-03-21T21:50:44.970 に答える
0

http://jsbin.com/aqoki3/edit - あなたが投稿したコードでここに21. したがって、JS のバグではありません。ブラウザの実装 (JS) のバグかもしれません。
したがって、日付変数を正しく初期化するにはnew Date(year, month, date [, hour, minute, second, millisecond ])( https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date ) を使用します。このようにして、暗黙的に 21 に設定するので、その日が 21 であることを確認できます。

于 2010-03-21T19:42:30.067 に答える
-3

日付のような文字列引数を渡して Date オブジェクトを作成することはできません。

このように作成します。

var str_date = "2010/03/21";
var date = new Date();
var date_elements = str_date.split("/");

date.setYear(date_elements[0]);
date.setMonth(date_elements[1]);
date.setDay(date_elements[2]);

alert(date.toString);

方法に注意date.toString。完全な日付文字列を返します。 date.getDateその日その日だけを提供します。

Date オブジェクトの詳細については、www.w3school.com を参照してください。

于 2010-03-21T21:02:15.770 に答える