web-dev-qa-db-ja.com

JavaScript getDateが誤った日付を返す

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

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

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

44
VahidN

_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
}
_
52
CMS

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以上のダミーの時間値を配置する方が簡単です。

30
Paulo Buchsbaum

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

15
eyelidlessness

getDate()でも1日の偏差がありますが、getUTCDate()は期待値を返すことに注意してください。問題はFF 3.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 date()は、タイムゾーンがその日に変更された場合など、1日で23時間を返すことを思い出します。

4
Chris

ブラウザのアドレスバーに次のコードを記述しましたが、結果は21

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

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

私がテストした実装はChrome 4.1.249。あなたのものは何ですか?

2
Jader Dias

ここで重要な役割を果たすのはタイムゾーンです。 Date()関数は、入力として与えている日付にタイムゾーンを追加します。たとえば、次のように入力しました。

alert(new Date("2018-09-15"));

私の結果は次のとおりです:Sat Sep 15 2018 05:30:00 GMT + 0530(インド標準時)

タイムゾーン+05:30が入力の時間に追加されます(上記の結果で確認できます。05:30:00が日付に追加されています。今、私が伝えているのは、タイムゾーンが0未満の場合です[国brazil、mexico、chile、...... 0未満のタイムゾーンを持つ]を選択すると、日付入力に追加されます(例:タイムゾーンはUTC-05:00です。指定された日付から-5:00が差し引かれます。

VahidN 、結果は20タイムゾーンが0未満であるため(-1è :00`など...)

解決策は、タイムゾーンを0にリセットすることです。このような:
Date( "2010-03-21T00:00:00")。

2
Steven Bala

Firefox 3.6でこのコードをテストし、IE 8:

<script type="text/javascript">

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

</script> 

正しい日付を表示しています:21

詳細については、 JavaScript Date Object をご覧ください。

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

1

文字列「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"));
} 
0
kennebec

使用している月の月が-1であることを確認します。6月を見る場合は、作成時に月に対して(6-1)

   var date_obj = new Date(y,(m-1),d);
0
CG_DEV

新しい日付に文字列の日付を指定する場合、文字列にはタイムゾーンを含める必要があります。そうしないと、ブラウザごとに(異なるjavascript実装のため)、マシンごとに(ローカルタイムゾーンの違いにより)解釈が異なります。

new Date('2017-07-31T10:00:00-0500');

の代わりに

new Date('2017-07-31T10:00:00');
0
Anis Dkhil

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になります。

0
NilColor