JavaScriptの日付をどのようにUTCに変換しますか?


590

Webサイトのユーザーが日付範囲を入力するとします。

2009-1-1 to 2009-1-3

何らかの処理のためにこの日付をサーバーに送信する必要がありますが、サーバーはすべての日付と時刻がUTCであると想定しています。

ここで、ユーザーがアラスカ、ハワイ、またはフィジーにいるとします。UTCとはかなり異なるタイムゾーンにあるため、日付範囲を次のように変換する必要があります。

2009-1-1T8:00:00 to 2009-1-4T7:59:59

JavaScriptのDateオブジェクトを使用して、最初の「ローカライズされた」日付範囲をサーバーが理解できるものにどのように変換しますか?


10
これは私にとってGoogleのトップヒットであり、新しいブラウザにはUTC日付文字列のサポートが組み込まれているため、復活しました。
jcomeau_ictx

4
承認された回答を更新して、新しいECMAscript 5 toISOString()メソッドを強調表示しました。stackoverflow.com/a/11957822/19112を
dthrasher 2013年

5
2015年に日付を文字列化して解析する必要がありますか?ばかげている!
ツールキット

2
もちろんあります。:-P少なくとも世界がタイムゾーンの使用を停止し、日付と時刻の統一を開始するまで、他の誰かがあなたのために仕事をすることに頼ることはできません。
Erenor Paz 2017

4
「Stardates」、できれば。
Michael Daw

回答:


370

このtoISOString()メソッドは、単純化された拡張ISO形式(ISO 8601)の文字列を返します。これは、常に24文字または27文字(それぞれYYYY-MM-DDTHH:mm:ss.sssZまたは文字±YYYYYY-MM-DDTHH:mm:ss.sssZ)です。タイムゾーンは、接尾辞 " Z"で示されるように、常にゼロUTCオフセットです。

出典: MDN web docs

必要なフォーマットは.toISOString()メソッドで作成されます。このメソッドをネイティブでサポートしていない古いブラウザ(ie8以下)の場合、shimは次の場所にあります

これにより、必要なことを実行できるようになります。

var isoDate = new Date('yourdatehere').toISOString();

タイムゾーンの作業にとって、moment.jsとmoment.jsのタイムゾーンは、特にクライアントとサーバーのJavaScript間でタイムゾーンをナビゲートするための非常に貴重なツールです。


81
実際、これは日付オブジェクトを文字列に変換し、それに対してそれ以上日付操作を実行できなくなります
orszaczky

2
@TheRebel、与えられたユースケースは、彼がサーバーにフォーマットされた文字列を送る必要があるということです。
Stern

28
@まあ、あなたは完全に正しいですが、私が想定するほとんどの視聴者と同じように、私はタイトルに基づいてここに到着し、JSの一般的な日付からUTCへの変換を検索しているので、ここで言及すると便利だと思いました:)
orszaczky 14

4
この方法を使用するときは注意してください!UTC日付は作成しません。既存の日付データをそのままUTC形式にフォーマットし、 "Z"タイムゾーンを指定します。これは99%の確率で間違っています!この方法を使用する前に、日付をGMTタイムゾーンに変換する必要があります。
user1944491

5
@ user1944491これは間違いだと思います。MDNドキュメントによると、toISOStringは正しくUTCに変換されます[toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetまた、この例では、toISOStringが呼び出されたときにオフセットが考慮されることを示しています
FFF

560

シンプルで愚か

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
私はあなたのアイデアが好きで、私が何度も使用している方法を実行しました。function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
Tim

21
私が思いついた最短のコードでは、UTCの日付を取得するには、時間、タイムゾーンオフloppingである:new Date(new Date().toUTCString().substr(0, 25))
joelvh

17
getUTCMonth()は0から11の値を返すことに注意してください。したがって、文字列ではなく数字で月が必要な場合は、値に+1すると役立ちます。
Talvi Watia

19
これはナンセンスです。新しい日付は、実際に必要な値とは異なる値になります。now.toUTCSTring()(間違った)の代わりに使用してくださいnow_utc.toString()
Bergi、2013年

22
私はこれを使用しません-new Date()を使用することで、ブラウザのタイムゾーンを取得します。Chrome 29とIE10では、日付と時刻は正しいように見えますが、タイムゾーンがブラウザーのタイムゾーンに設定されているため、問題が発生する可能性があります...
Sean

207

これが私の方法です:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

結果のutcオブジェクトは実際にはUTC日付ではありませんが、ローカル日付はUTC時間に一致するようにシフトされています(コメントを参照)。しかし、実際にはそれは仕事をします。


Date.now()UTC時間ではなく現地時間を与えることに気付いたとき、私はその問題を調べていました。この解決策は私には最も簡単に思えます。少なくとも私の場合は、UNIXの時間が必要で、適切にフォーマットされた文字列ではありません。(唯一の違いは、60 * 1000明確にするために私が掛けるということでした:))
TimothéeBoucher

18
60000 * Date.getTimezoneOffset()の追加は正しくありません。まず、すべての日付/時刻を、表示のためにタイムゾーン修飾子を持つUTCであると考える必要があります。ブラウザは異なる場合がありますが、Date.getTime()は1970-01-01以降のミリ秒数を返します。この数値を使用して新しい日付を作成する場合、例:new Date(Date.getTime()); これはUTCになりますが、表示すると(例:クロム開発ツールコンソールから)、ローカルタイムゾーンのように見えます。
アーロンホフマン

15
私のブラウザーでは、これによりUTCではないDateTimeが作成されます。ただし、ブラウザ内に表示すると、タイムゾーン情報が無視された場合に正しいUTC時刻になるローカルタイムゾーンでDateTimeが表示されます。
アーロンホフマン

ゴッチャ、面白いポイント。と比較now.toString()してみましょうutc.toString():タイムゾーンの変更はありませんが、時間の変更はあります。これはまったく異なります。ただし、よりクリーンなソリューションの方がはるかに複雑になります(私はそう思います)。このコードは、タイムゾーンをさらに処理しない限り、ほとんどの場合に機能します。それは私にアヒルのパンチングを思い出させました:異なることですが同じように振る舞うように作られました。また、DrunkCoderのコードにも同じ問題があることに注意してください。
Gras Double

4
この回答は、「エポックシフト」の別の一般的な実装を示しています。これは、DST遷移のようなエッジケースの近くで失敗する可能性があるため、単独では危険です。推奨されません。
Matt Johnson-Pint 2016年

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

これはうまくいきます。JavaScriptの日付を作成するために、ソースの日付の「-」を「/」に置き換えるだけでよいので、toISO()関数を呼び出して正しい出力を取得できます。
dthrasher 2009年

これはうまくいきます。結果をjQuery $ .parseDate(...)にフィードして、UTCにシフトされた日付オブジェクトを取得することもできます。
Brian Ellis

23

日付/時刻を変更せずにISOに変換

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

日付/時刻を変更してISOに変換(日付/時刻は変更されます)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

フィドルリンク


これは一種の偽造UTCですか?現地の日付を変更して、PCの時計に実際に表示されている日付と時刻をサーバーに送信しました。ワオ。いずれにせよ、ストリニフィングと解析よりも優れている
ツールキット

また、.toISOString()は必要ありません。isoDateをサーバーに送信するだけです
ツールキット

.toISOString()はシンプルで簡単です。日付を取得することは追加の手順になります(isoDateは関数ではありません)。
RollerCosta

オフセットを減算するのではなく、追加する必要はありませんか?stackoverflow.com/a/11964609/832230を
Acumenus

@ABB現在のタイムゾーンオフセットが+ veの場合、それを減算する必要があります(この場合、ISTは+5:30)。それ以外の場合は追加します。
RollerCosta

18

ブラウザーは異なる場合があり、クライアントによって生成された情報を信頼しないことも忘れないでください。つまり、以下のステートメントは私には有効です(Mac OS X 10.8.2上のGoogle Chrome v24)。

var utcDate = new Date(new Date().getTime());


編集:「これは単なるものとnew Date()どう違うのですか?」こちらをご覧くださいhttps : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • 引数が指定されていない場合、コンストラクターはシステム設定に従って現在の日時のJavaScript Dateオブジェクトを作成します。
  • 注:Dateが複数の引数を持つコンストラクターとして呼び出される場合、指定された引数は現地時間を表します。UTCが必要な場合は、同じ引数でnew Date(Date.UTC(...))を使用します。(注:Date.UTC()は、1970-01-01 00:00:00 UTC以降のミリ秒数を返します)

以前の回答で述べた60000 * Date.getTimezoneOffset()の追加は正しくありません。まず、すべての日付/時刻を、表示のためにタイムゾーン修飾子を持つUTCであると考える必要があります。

繰り返しになりますが、ブラウザは異なる場合がありますが、Date.getTime()は1970-01-01 UTC / GMT以降のミリ秒数を返します。上記のようにこの番号を使用して新しい日付を作成すると、UTC / GMTになります。ただし、.toString()を呼び出すことによって表示する場合、.toString()は呼び出されたDateオブジェクトのタイムゾーンではなくローカルタイムゾーンを使用するため、ローカルタイムゾーンにあるように見えます。

また、日付で.getTimezoneOffset()を呼び出すと、呼び出した日付オブジェクトのタイムゾーンではなく、ローカルタイムゾーンが返されることもわかりました(ただし、これが標準であるかどうかは確認できません)。

私のブラウザーでは、60000 * Date.getTimezoneOffset()を追加すると、UTCではない DateTimeが作成されます。ただし、ブラウザー内で表示すると(例:.toString())、タイムゾーン情報が無視された場合は正しいUTC時間であるローカルタイムゾーンでDateTimeが表示されます。


11
FxとChromeでこのコードを実行したところ、動作しないようです。結果はとまったく同じです。new Date()タイムスタンプもタイムゾーンも変更されていません
Gras Double

3
これは、タイムスタンプがタイムゾーンを含まないためです。new Date().getTime()常にタイムゾーンに依存しないタイムスタンプを返します。Unixエポック以降のミリ秒数以外の形式にフォーマットしようとするまで、タイムスタンプは関連付けられません。
frontendbeauty 2013

7
私が知る限り、とnew Date(new Date().getTime())まったく同じ値を返しますnew Date()。あなたの回答がどのような意味で明確な価値を提供するかを説明できますnew Date()か?
カークウォル

この値をサーバーに投稿していますnew Date("5/19/2014").getTime()。Dateコンストラクターは、+ 7オフセットの日付を作成しました。サーバー(C#)で、投稿された値をミリ秒としてUNIXエポックに追加しますnew DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)。結果は5/19/2014 7:00:00 AMです。したがって、getTime()はUTCオフセットを含むミリ秒数を提供するようです。
xr280xr 2014年

1
new Date(new Date().getTime())うまくいかないと文句を言うコメントがたくさんあります。new Date(Date.UTC(2019, 8, 27, 0, 0, 0))実際にUTC時間を生成することを確認できます。使用に失敗するDate.UTC(...)と、タイムゾーンのUTCオフセットで日付が表示されます。
Alex Barker

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
日付オブジェクトは実際に日付に設定する必要があります。上記は一例です。
James Skidmore、

5
これで、 "Thu、04 Jun 2009 04:10:56 GMT"が返されますが、これはOPで必要なISO形式ではありません。
nickf 2009年

4
これは日付ではない文字列に変換します
Anthony

2
いいえ、実際には、それはOPによる日付の文字列表現である必要があります。
jcomeau_ictx

3
UTCに変換した後、文字列形式で返され、次にgetMonth()、getDate()などのメソッドにアクセスする方法
Sandeep sandy

10

UTCに変換して日付オブジェクトとして保持する別の解決策:(フォーマットされた文字列の末尾から「GMT」部分を削除してから、Dateコンストラクターに戻すことで機能します)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

日時ピッカーライブラリとインターフェイスするには、これを行う必要がありました。しかし、一般的に、この方法で日付を処理することは悪い考えです。

ユーザーは通常、現地時間で日付時刻を処理したいので、サーバー側のコードを更新して、オフセットを含む日付時刻文字列を正しく解析してから、UTCに変換する(最適なオプション)か、クライアント側に送信する前にクライアント側でUTC文字列に変換します。サーバー(ウィル・スターンの答えのように)


7

日付をそのような文字列に変換しようとしていますか?

そのための関数を作成しますが、少し物議を醸していますが、Dateプロトタイプに追加します。これに慣れていない場合は、スタンドアロン関数として配置し、日付をパラメーターとして渡すことができます。

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

UTC時間で必要な場合は、すべてのget *関数をgetUTC *に置き換えるだけです。例:getUTCFullYear、getUTCMonth、getUTCHours ...そして、ユーザーのタイムゾーンオフセットの代わりに「+00:00」を最後に追加します。


1
これは、タイムゾーンオフセットを処理しようとする最初の例なので、+ 1します。しかし、私はそれにいくつかのことを見つけました-temp.substr(-2)は文字列ではなく数値であるためエラーが発生するため、「temp = '' + temp;」のようにする必要があります。まず、文字列に変換します。また、私はISO日付をゼロで埋めることを好みます-これにより、より標準的なものになると思います。
Mick Sear

@ミック-そのバグを修正するために更新しました。最近ではString(temp)、他の方法("" + temp)がJSLintエラーとして報告されるため、私はこれを使用しています。
nickf

これは現在、toISOStringメソッド
Bergi

7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

ほとんどの新しいブラウザで動作するはずです。2012-07-28T00:00:00.000ZFirefox 6.0 に戻ります


7

日付を扱うときの私の推奨は、ユーザー入力から日付を個々のフィールドに解析することです。フルストリングとして使用できますが、火で遊んでいます。

JavaScriptは、2つの等しい日付を異なる形式で異なる方法で処理できます。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

次のようなことはしないでください:

new Date('date as text');

ユーザー入力から日付を個別のフィールドに解析したら、日付オブジェクトを作成します。日付オブジェクトを作成したら、タイムゾーンオフセットを追加してUTCに変換します。DSTのために、日付オブジェクトからのオフセットを使用することがどれほど重要であるかを強調することはできません(理由を示すための別の議論です)。

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

これで、日付をUTC時間でサーバーに渡すことができます。繰り返しますが、日付文字列を使用しないことを強くお勧めします。それを、必要な最小の細分度(たとえば、年、月、日、分)に分解してサーバーに渡すか、UNIXエポックからのミリ秒などの値として渡します。



6

日付を多く扱う場合は、moment.js(http://momentjs.com)を使用する価値があります。UTCに変換する方法は次のとおりです。

moment(yourTime).utc()

形式を使用して、日付を任意の形式に変更できます。

moment(yourTime).utc().format("YYYY-MM-DD")

現時点ではオフセットオプションもありますが、タイムゾーンを処理するための追加の補足ライブラリがあります(http://momentjs.com/timezone/)。時間変換は次のように簡単です。

moment.tz(yourUTCTime, "America/New_York")

違いは何だmoment(yourTime).utc()とは moment.utc(yourTime)?私は通常後者を使用します。
ps0604

5

私のソリューションでは、クライアント側で設定されているタイムゾーンに関係なく、日付を同じに保ちます。多分誰かがそれを便利だと思うでしょう。

私のユースケース:

タスクの日付を設定するToDoアプリを作成しています。この日付は、どのタイムゾーンにいても一定である必要があります。

例。6月25日の午前8時に友達に電話したいとします。

このタスクは、中国にいる5日前(6月20日)に作成します。

その後、同じ日にニューヨークに数日間飛行機で行きます。

次に、6月25日、まだニューヨークにいる間、午前7時30分に起床します(つまり、30分でタスク通知を受け取る必要があります(中国で作成したときの午後1時30分であっても)。仕事)

したがって、タスクはタイムゾーンを無視しています。これは、「午前8時に、どのタイムゾーンにでもなりたい」を意味します。

私がやっていることは、「あなたはいつもロンドンのタイムゾーンにいると思います-UTC」です。

つまり、ユーザーが自分のタイムゾーンで日付を選択すると、この日付がUTCの同じ日付に変換されます。すなわち。中国では午前8時を選択しますが、UTCでは午前8時に変換します。

次に、次にアプリを開いたときに、UTCに保存された日付を読み取り、現在のタイムゾーンの同じ日付に変換します。UTCでの午前8時をニューヨークのタイムゾーンでの午前8時に変換します。

この解決策は、日付をどこに設定するか、どこを読むかに応じて、日付が別の意味になることを意味しますが、常に同じタイムゾーンにいるように「感じる」ように一定です。

いくつかのコードを書いてみましょう:

まず、タイムゾーンを無視してUTCとの間で変換を行うための2つの主要な関数があります。

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

次に、この日付を次のように保存/読み取ります:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

私はちょうど、Steven Levithanの1.2.3バージョンのdate.format.jsが私が望んでいることを実行していることを発見しました。JavaScript日付のフォーマット文字列を指定でき、現地時間からUTCに変換されます。これが私が今使っているコードです:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
これはあなたの質問に対する最良の答えではないようです。あなたの質問に直接答えるものを再考するか、別の方法で質問してください。
hitautodestruct 2012年

1
IE7とFirefoxには不十分であるため、たまたまこの正確なスクリプト(およびバージョン)を修正しています。
Barbarrosa

4

jQueryグローバリゼーションプラグインの日付解析が最適に機能することがわかりました。他のメソッドにはブラウザ間の問題があり、date.jsのようなものはしばらく更新されていませんでした。

また、ページにdatePickerも必要ありません。あなたはドキュメントで与えられた例に似たものを呼び出すことができます:

$.parseDate('yy-mm-dd', '2007-01-26');

1
何かが更新されていないからといって、それを使用すべきではないという意味ではありません。Date.jsは何年もの間完全に機能してきたため、更新する必要はありませんでした。JSの日付オブジェクトと使用されている日付形式は過去数年間変更されていませんが、なぜそれらを操作するスクリプトを使用するのでしょうか。Date.JSは、最高のJS Dateライブラリです。githubにはいくつかの問題がありますが、それ以外の場合は完璧です。github.com/datejs/Datejs
thugsb

3

この機能は私にとって美しく機能します。

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

これにより、適切なUTCの日付と時刻が得られます。
これgetTimezoneOffset()は、タイムゾーンの違いを分単位で示すためです。toISOString()出力は文字列になるため、使用しないことをお勧めします。したがって、今後は日付を操作できなくなります。



2

日付オブジェクトが必要な場合

日付文字列Dateのみを渡すと、時間はタイムゾーンでシフトされた00:00であると想定されます。

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

現在の時間と分を追加すると、適切な日付が得られます。

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

質問を見て、後処理のために日付範囲をバックエンドに送信したいだけであることは明らかです。

データが特定の形式であることを期待する標準のデータガイドラインに準拠していることを前提としています。たとえば、RESTfull APIであるODATAを使用します。これは、日時オブジェクトが次の形式であると想定しています。

YYYY-MM-DDT00:00:00。

以下のスニペットで簡単に実現できます(必要に応じて形式を変更してください)。

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

一方、あなたがバックエンドから日付を受け取った私の状況にいる場合、ブラウザはそれをローカル日付に変換します。一方、UTC日付に興味がある場合は、次の操作を実行できます。

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

上記のコードスニペットは、基本的に、タイムゾーンに基づいてブラウザーによって追加/減算された時間を加算/減算します。

たとえば、EST(GMT-5)にいて、サービスが日付時刻オブジェクトを返した場合= Wed Aug 17 2016 00:00:00 GMT-0500ブラウザはタイムゾーンオフセット(5時間)を自動的に差し引いてローカル時間を取得します。したがって、時間を取得しようとすると、2016年8月16日水曜日19:00:00 GMT-0500になります。これは多くの問題を引き起こします。確かにこれを容易にするライブラリはたくさんありますが、純粋なJSアプローチを共有したいと思いました。

詳細については、http//praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/をご覧ください。私が得たの私インスピレーション。

お役に立てれば!


1

このメソッドは次のようになります。ゾーン変数を2017-08-04T11:15:00.000+04:30無視して単純に取得できます。2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

モーメントパッケージを使用すると、UTCの日付文字列を新しい日付オブジェクトに簡単に変換できます。

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

これは特に、サーバーがタイムゾーンをサポートしておらず、UTC日付を常にサーバーに保存して新しい日付オブジェクトとして取得したい場合に役立ちます。上記のコードは、このスレッドが対象とする同様の問題の私の要件に対応しました。他の人を助けることができるようにここで共有します。上記の解決策は正確にはわかりません。ありがとう。


4
これで質問の答えになるかもしれませんが、コードの説明はありません。回答を更新して、何をしているかを説明してください。ありがとう!
Miroslav Glamuzina


0

私はこの質問が古いことを知っていますが、これと同じ問題を見ていました。1つのオプションは、代わりにサーバーにdate.valueOf()を送信することです。JavaScript DateのvalueOf()関数は、UTC 1970年1月1日の午前0時からのミリ秒数を送信します。

valueOf()


0

したがって、JavaScriptの日付オブジェクトを日付として操作する必要があり、残念ながらこれらの答えの多くは文字列に移動する必要があるため、これは私がやらなければならなかった方法です。

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

糸追加瞬間

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

さらにシンプル

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
これは不完全です。 setTimeは含まれnew Dateていません。答えを完成させてください。
random_user_name 2012

この男はまだ生きていますか?私たちに戻って、何かを言ったり、答えを編集したりしないのはなぜですか?
絶望的な
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.