私のJava Scriptアプリでは、次のような形式で日付を保存しています。
2011-09-24
上記の値を使用して新しいDateオブジェクトを作成しようとすると(別の形式で日付を取得できるため)、日付は常に1日戻ってきます。下記参照:
var doo = new Date("2011-09-24");
console.log(doo);
ログ:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
私のJava Scriptアプリでは、次のような形式で日付を保存しています。
2011-09-24
上記の値を使用して新しいDateオブジェクトを作成しようとすると(別の形式で日付を取得できるため)、日付は常に1日戻ってきます。下記参照:
var doo = new Date("2011-09-24");
console.log(doo);
ログ:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
回答:
東部夏時間であることに注意して-4 hours
ください。また、戻ってきた日の時間は20
です。
20h + 4h = 24h
2011-09-24の真夜中です。タイムゾーンインジケーターなしで日付のみの文字列を指定したため、日付はUTC(GMT)で解析されました。代わりにインジケータなしの日付/時刻文字列を指定した場合(new Date("2011-09-24T00:00:00")
)を指定した場合、それはローカルタイムゾーンで解析されます。(歴史的には、特に仕様が複数回変更されたために不整合がありましたが、最新のブラウザーは大丈夫です。または、タイムゾーンインジケーターを常に含めることができます。)
正しい日付を取得していますが、正しいタイムゾーンを指定したことはありません。
日付の値にアクセスする必要がある場合は、getUTCDate()
またはその他のgetUTC*()
関数を使用できます。
var d,
days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
new Date('2012-01-01 GMT')
場合でも、ユーザーのローカル日付時刻に変換するときにオフセットが適用されます。
get*
メソッドを使用せざるを得ず、不明なタイムゾーンオフセットを含む正しい日付/時刻を返す必要がある場合は、不明なタイムゾーンオフセットを追加するだけです。d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());
これにより、日付がユーザーのロケールに正規化され、.get*
メソッドから返されます。期待値。その場合、.getUTC*
メソッドは正しくなくなりますので、注意してください。
文字列を変換するJS DATEオブジェクトで発生するクレイジーなことがいくつかあります。たとえば、次の日付を指定したとします
注:以下の例は、またはであってもなくてもよいOFF ONE DAYに応じYOURタイムゾーンと現在の時刻。
new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
ただし、文字列形式をMonth-Day-Yearに再配置すると...
new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
別の奇妙なもの
new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.
new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
新しい日付を作成するときに、日付「2011-09-24」のハイフンを簡単に変更できます
new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
「2011-09-24T00:00:00」のような日付文字列があったらどうなるでしょう
new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
以前と同様に、ハイフンをスラッシュに変更します。何が起こるのですか?
new Date("2011/09/24T00:00:00");
// => Invalid Date
私は通常、日付形式2011-09-24T00:00:00を管理する必要があるため、これを実行します。
new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.
更新
Dateコンストラクターに個別の引数を指定すると、以下で説明するように他の有用な出力を取得できます
注:引数は、Number型またはString型にすることができます。値が混在する例を示します。
特定の年の最初の月と日を取得します
new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)
年の最後の月と日を取得する
new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)
数値、文字列引数の例。ゼロベースの月が再びあるため、月は3月です。
new Date(2011, "02");
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)
同じことをしますが、1日がゼロの場合、別の結果になります。
new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)
年と月の引数にゼロの日を追加すると、前月の最終日が取得されます。負の数を続けると、別の日にロールバックできます
new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
日付を正規化し、不要なオフセットを排除するには(ここでテスト:https : //jsfiddle.net/7xp1xL5m/):
var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) ) );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)
これは同じことを達成し、@ tparteeの功績をたたえます(ここでテスト済み:https ://jsfiddle.net/7xp1xL5m/1/ ):
var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 ) );
doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
文字列の末尾にスペースを追加すると、作成にUTCが使用されることを追加したいだけです。
new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)
new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)
編集:これは推奨されるソリューションではなく、代わりの答えです。何が起こっているのか非常に不明確なので、このアプローチは使用しないでください。誰かがこれをリファクタリングして誤ってバグを引き起こす可能性がある方法はいくつかあります。
タイムゾーンの調整に関係していると思います。作成した日付はGMTで、デフォルトの時刻は午前0時ですが、タイムゾーンはEDTなので、4時間差し引かれます。これを試して確認してください:
var doo = new Date("2011-09-25 EDT");
これはおそらく良い答えではありませんが、この問題に関する私の経験を共有したいと思います。
私のアプリは「YYYY-MM-DD」という形式のutc日付をグローバルに使用していますが、使用するdatepickerプラグインはjs日付のみを受け入れますが、utcとjsの両方を考慮するのは難しいです。したがって、「YYYY-MM-DD」形式の日付を日付ピッカーに渡したい場合、最初に、それを「MM / DD / YYYY」形式に変換します。moment.jsなどを使用すると、日付ピッカーに表示される日付は正しい。あなたの例のために
var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale
どうやらd1は私が欲しいものです。これが一部の人々に役立つことを願っています。
これはループを通して私を通して、zzzBovの答えに+1します。これは、UTCメソッドを使用して私のために働いた日付の完全な変換です:
//myMeeting.MeetingDate = '2015-01-30T00:00:00'
var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!
myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!
OPの場合、タイムゾーンはEDTですが、スクリプトを実行するユーザーがEDTタイムゾーンであるとは限らないため、オフセットのハードコーディングが必ずしも機能するとは限りません。私が見つけたソリューションは、日付文字列を分割し、Dateコンストラクターで個別の値を使用します。
var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);
JSの別の奇妙さを説明する必要があることに注意してください。月はゼロベースです。
私のクライアントが大西洋標準時を使用している場合、この正確な問題が発生しました。クライアントが取得した日付値は「2018-11-23」で、コードがnew Date("2018-11-23")
クライアントの出力に渡した日付は前日の日付値です。日付を正規化するスニペットに示すように、ユーティリティ関数を作成して、クライアントに期待される日付を与えました。
date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
var normalizeDate = function(date) {
date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
return date;
};
var date = new Date("2018-11-23");
document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
<label><b>Default</b> : </label>
<span id="default"></span>
</div>
<hr>
<div>
<label><b>Normalized</b> : </label>
<span id="normalized"></span>
</div>
日付の個々の部分が表示目的で同じままであることを確認したいだけの場合、*タイムゾーンを変更しても、これは機能するようです:
var doo = new Date("2011-09-24 00:00:00")
そこにゼロを追加するだけです。
私のコードではこれを行います:
let dateForDisplayToUser =
new Date( `${YYYYMMDDdateStringSeparatedByHyphensFromAPI} 00:00:00` )
.toLocaleDateString(
'en-GB',
{ day: 'numeric', month: 'short', year: 'numeric' }
)
コンピューターのタイムゾーンを切り替えても、日付はAPIから取得したyyyy-mm-ddの日付文字列と同じままです。
しかし、私は何かを逃していますか/これは悪い考えですか?
*少なくともクロム。これはSafariでは機能しません!この執筆時点
.toISOString()
、1日戻ります。
new Date('2019/11/18 05:30:00').toISOString();
私のために働いた
より多くの変換方法を使用せずにこれを処理する最良の方法は、
var mydate='2016,3,3';
var utcDate = Date.parse(mydate);
console.log(" You're getting back are 20. 20h + 4h = 24h :: "+utcDate);
日付にGMTを追加するか、追加することができます。
var mydateNew='2016,3,3'+ 'GMT';
var utcDateNew = Date.parse(mydateNew);
console.log("the right time that you want:"+utcDateNew)
私はこのような問題に直面しました。しかし、私の問題は、データベースから日付を取得する際のオフセットでした。
これはデータベースに格納され、UTC形式です。
2019-03-29 19:00:00.0000000 +00:00
したがって、データベースから取得して日付を確認すると、オフセットが追加され、JavaScriptに返送されます。
これは私のサーバーのタイムゾーンであるため、+ 05:00を追加しています。私のクライアントは+07:00の異なるタイムゾーンにいます。
2019-03-28T19:00:00 + 05:00 //これはJavaScriptで取得できるものです。
だからここに私がこの問題で何をすべきか私の解決策があります。
var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);
だから日付がサーバーから来てサーバーオフセットがあるとき、日付を分割してサーバーオフセットを削除してから日付に変換します。それは私の問題を解決します。
このページによれば、UTCタイムゾーンを使用して日付を作成するISO日付文字列形式を使用しています。
注:Dateコンストラクター(およびDate.parse、これらは同等)を使用して日付文字列を解析することは、ブラウザーの違いと不整合のため、強くお勧めしません。RFC 2822形式の文字列のサポートは、慣例によるものです。ISO 8601形式のサポートは、日付のみの文字列(「1970-01-01」など)がローカルではなくUTCとして扱われる点が異なります。
のようにテキストの形式を変えると、"Jan 01 1970"
(少なくとも私のマシンでは)ローカルタイムゾーンが使用されます。
私の2セントをこのスレッドに追加しようとしています(@ paul-wintzの回答について詳しく説明しています)。
DateコンストラクターがISO 8601形式の最初の部分(日付部分)に一致する文字列を受け取ると、日付が0のUTCタイムゾーンで正確な日付変換を行うように思えます。その日付が現地時間に変換されるとき、深夜UTCが現地時間帯の早い日付である場合、日付シフトが発生する可能性があります。
new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)
日付文字列が他の「緩い」形式(「/」を使用するか、日付/月にゼロが埋め込まれていない)の場合、ローカルタイムゾーンで日付が作成されるため、日付シフトの問題はありません。
new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
したがって、前述のように、ISO形式の日付のみの文字列で「-」を「/」に置き換えると、簡単な修正が1つあります。
new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
yyyy-mm-dd
MySql Date形式で保存するには、次の操作を行う必要があります。
const newDate = new Date( yourDate.getTime() + Math.abs(yourDate.getTimezoneOffset()*60000) );
console.log(newDate.toJSON().slice(0, 10)); // yyyy-mm-dd
ログはGMTを出力するので、タイムゾーンを指定します。
var doo = new Date("2011-09-24 EST");
気にしない、GMT -0400に気づかなかった、それが日付を昨日にする
デフォルトの「時間」を12:00:00に設定しようとすることができます