731

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

2009-1-1 to 2009-1-3

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

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

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

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

4

33 に答える 33

639

シンプルでバカ

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);
于 2011-07-21T14:14:22.103 に答える
508

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

出典: MDN Web ドキュメント

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

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

var isoDateString = new Date().toISOString();
console.log(isoDateString);

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

于 2012-08-14T17:43:52.813 に答える
237

これが私の方法です:

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

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

于 2012-08-15T05:41:56.247 に答える
33

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

フィドルリンク

于 2015-02-20T14:00:12.927 に答える
26
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(':');    
}
于 2009-06-04T04:20:27.647 に答える
23

ブラウザは異なる場合があり、クライアントによって生成された情報を信頼しないことも忘れないでください。以下のステートメントは私にとってはうまくいきます(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 年 1 月 1 日 UTC/GMT からのミリ秒数を返します。上記のようにこの数値を使用して新しい日付を作成すると、UTC/GMT になります。ただし、.toString() を呼び出して表示すると、.toString() は呼び出された Date オブジェクトのタイムゾーンではなく、ローカルのタイムゾーンを使用するため、ローカルのタイムゾーンにあるように見えます。

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

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

于 2013-01-30T17:52:25.140 に答える
22

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

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

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

ユーザーは通常、日時をローカル時間で操作することを望んでいるため、サーバー側のコードを更新してオフセット付きの日時文字列を正しく解析してから UTC に変換するか (最適なオプション)、クライアント側で UTC 文字列に変換してからサーバーに送信します。サーバー(Will Sternの回答のように)

于 2016-11-03T22:59:48.953 に答える
17
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();
于 2009-06-04T03:59:31.837 に答える
8
date = '2012-07-28'; stringdate = new Date(date).toISOString();

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

于 2012-06-28T14:18:26.640 に答える
8

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

それを行う関数を作成し、少し物議をかもしますが、それを 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」を追加します。

于 2009-06-04T04:10:48.720 に答える
6

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

moment(yourTime).utc()

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

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

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

moment.tz(yourUTCTime, "America/New_York")
于 2016-09-01T14:40:00.230 に答える
5

jQuery グローバリゼーション プラグインの日付解析が最適であることがわかりました。他の方法にはクロスブラウザーの問題があり、date.js などはかなり長い間更新されていませんでした。

ページに datePicker も必要ありません。ドキュメントに示されている例に似たものを呼び出すことができます:

$.parseDate('yy-mm-dd', '2007-01-26');
于 2010-12-30T22:01:43.810 に答える
4

私は、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'); 
于 2009-06-04T15:50:42.287 に答える
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();
}
于 2014-04-08T17:57:26.833 に答える
3

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

日付文字列 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)
于 2018-09-07T10:38:50.030 に答える
3

このメソッドは次のことを示します。ゾーン変数を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;
}
于 2017-08-27T06:16:03.153 に答える
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/をご覧ください。インスピレーション。

お役に立てれば!

于 2016-08-17T11:19:21.387 に答える
0

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

valueOf()

于 2016-08-16T15:42:41.270 に答える
0

GMT時間を取得するために私が見つけた最良の方法は、最初にローカルの日付時刻を取得することです。次に、GMT 文字列に変換します。次に、文字列を使用して、タイムゾーンを削除して新しい時間を構築します。

let dtLocal = new Date()
let dt = new Date(dtLocal.toISOString().split('Z')[0])

注: - GMT で新しい日時が作成されます。ただし、タイムゾーンが関連付けられるため、現地の日時になります。

于 2021-03-20T12:38:19.173 に答える
-1

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 
于 2019-06-29T23:00:07.110 に答える
-8

さらにシンプルに

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);
于 2012-09-26T08:01:03.727 に答える