web-dev-qa-db-ja.com

JavaScriptの日付をUTCに変換する方法

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

2009-1-1 to 2009-1-3

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

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

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

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

491
dthrasher

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

ソース: MDNウェブドキュメント

必要なフォーマットは.toISOString()メソッドで作成されています。このメソッドをネイティブにサポートしていない古いブラウザ(ie 8以下)では、シムが見つかります ここ

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

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

Timezoneの仕事では、 moment.jsとmoment.jsのtimezone は本当に貴重なツールです。特にクライアントとサーバーのJavaScriptの間でタイムゾーンをナビゲートするのに役立ちます。

319
Will Stern

シンプルでバカ

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);
504
DrunkCoder

これが私の方法です:

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

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

169
Gras Double
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(':');    
}
24
kennebec

日付/時刻を変更せずに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 

Fiddle link

20
RollerCosta

ブラウザは異なるかもしれませんし、クライアントによって生成された情報を信頼しないことを忘れないでください、と言われて、次のステートメントは私のために働きます(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が必要な場合は、同じ引数を持つ新しいDate( Date.UTC(...) )を使用します。 (注:Date.UTC()は、1970-01-01 00:00:00 UTCから経過したミリ秒数を返します)

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

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

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

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

18
Aaron Hoffman
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
14
James Skidmore

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

私はそれを行うための関数を作りたいと思います、そしてそれは少し物議を醸していますが、それを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"を追加します。

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

ほとんどの新しいブラウザで動作するはずです。 Firefox 6.0では2012-07-28T00:00:00.000Zを返します

7
jcomeau_ictx

日付を扱うときの私のお勧めは、ユーザー入力から個々のフィールドに日付を解析することです。あなたはそれを完全な弦として使うことができますが、あなたは火で遊んでいます。

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エポックからのミリ秒のような値として。

7

あなたが日付をたくさん扱っているなら、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")
5
Adam Boostani

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

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

これは、日時ピッカーライブラリと連携するために必要でした。しかし、一般的にこのように日付を扱うのは悪い考えです。

ユーザーは通常、現地時間で日時を処理することを望んでいるので、オフセット付きの日時文字列を正しく解析するようにサーバー側のコードを更新してからUTCに変換する(最良のオプション)かサーバー(Will Sternの回答のように)

5
CMcClymont

jQueryグローバリゼーション・プラグイン dateの構文解析が最も効果的であることがわかりました。他の方法ではブラウザ間の問題があり、date.jsのようなものはしばらくの間更新されていませんでした。

ページにdatePickerも必要ありません。あなたはちょうどdocsで与えられた例に似た何かを呼ぶことができます:

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

私はSteven Levithanの date.format.js 1.2.3バージョンが私が望むことをしてくれることを発見しました。それはあなたが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'); 
4
dthrasher

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

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();
}
3
Will Strohl

moment.js UTCメソッドを使用する ;

const moment = require('moment');
const utc = moment.utc(new Date(string));
2
Yaki Klein
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()を使用しないことをお勧めします。したがって、将来的には日付を操作することはできなくなります

1
Sanket Patel

あなたの質問を見れば明らかなように、あなたはさらなる後処理のためにあなたのバックエンドに日付範囲を送りたいだけなのです。

私はあなたがデータが特定のフォーマットであることを期待する標準的なデータガイドラインに準拠していると仮定しています。例えば、私は日時オブジェクトがフォーマットであることを期待する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)に入っていて、私のサービスがdate time object = Wed Aug 17 2016 00:00:00 GMT-0500を返す場合、私のブラウザは自動的にタイムゾーンオフセット(5hrs)を引いて現地時間を得ます。だから私は時間を取得しようとすれば私は水8月16の2016 19:00:00 GMT-0500を取得します。これは多くの問題を引き起こします。これを容易にするライブラリはたくさんありますが、私は純粋なJSのアプローチを共有したいと思いました。

詳細については見てください: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ whereで私は私のインスピレーションを得ました。

お役に立てれば!

1
Reeth

これは私が過去にやったことです:

var utcDateString = new Date(new Date().toUTCString()).toISOString();
1
Pradyumna Das

このメソッドはあなたに与えるでしょう:2017-08-04T11:15:00.000+04:30そしてあなたは単に2017-08-04T11:15:00.000を得るために zone 変数を無視することができます。

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の日付文字列を新しいDateオブジェクトに簡単に変換できます。

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

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

0
Bimal Jha

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

valueOf()

0
weagle08

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

日付文字列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)
0
keemor

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