簡體   English   中英

使用UTC時區將毫秒轉換為UTC日期對象

[英]Convert milliseconds into UTC date object with UTC Time Zone

我正在嘗試將毫秒轉換為UTC日期對象,如下所示-

var tempDate = new Date(1465171200000);
// --> tempDate = Mon Jun 06 2016 05:30:00 **GMT+0530 (India Standard Time)** {}

var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(),  tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds());
//--> _utcDate = Mon Jun 06 2016 00:00:00 **GMT+0530 (India Standard Time)** {}

時間已重置為UTC時間,但時區仍為GMT + 0530(印度標准時間)。 有沒有確定的方法將毫秒轉換為UTC時區的UTC日期對象?

引用此答案 (建議您完整閱讀):

Date對象本身沒有存儲任何時區或字符串格式。 當使用Date對象的各種功能時,計算機的本地時區將應用於內部表示。

由於時區未存儲在Date對象中,因此無法進行設置。

我看到兩個選擇:

首先是利用一個庫(如以上答案中所建議)。 現在非常流行的是Moment.js

第二個 (純JavaScript-如果在您的上下文中這是可行的解決方案):

在您當地的時區進行“時間數學”。

當您准備切換到UTC時,請使用toUTCString()方法。

當然,您最終將得到一個字符串,因為它使您可以將時區存儲為與日期時間值一樣長的時間。

因為從現在開始您將無法將日期時間作為Date對象進行操作,所以這必須是最后一步。

var tempDate = new Date(1465171200000);
// Mon Jun 06 2016 05:30:00 GMT+0530

// Do your date time math here
// using the Date object's methods

var utcDateAsString = tempDate.toUTCString();
// Mon Jun 06 2016 00:00:00 GMT

你說:

時間已重置為UTC時間,但時區仍為GMT + 0530(印度標准時間)。 有沒有確定的方法將毫秒轉換為UTC時區的UTC日期對象?

但是我認為您誤會了正在發生的事情。 當您將數字傳遞給Date構造函數時,如下所示:

new Date(1465171200000)

假設自ECMAScript紀元(1970-01-01T00:00:00Z)起以毫秒為單位,那么將使用該值作為內部時間值創建Date對象。 所以Date對象本質上是UTC。

當您將其寫入字符串時,內部會根據主機時區設置生成一個人類可讀的日期字符串,這就是為什么您看到GMT + 0530的日期(即主機系統時區設置)的原因。 Date對象本身沒有時區,始終為UTC。

當您隨后使用UTC值使用以下方法創建“本地”日期時:

new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), ...)

然后使用主機時區來生成一個UTC時間值,該時間值等於相關值的“本地”日期。 您已經從原始時間值中有效地減去了時區偏移,因此它現在代表了一個不同的時刻。 您可以通過執行以下操作獲得完全相同的結果:

var d = new Date(1465171200000);
d.setMinutes(d.getMintues() + d.getTimezoneOffset());

只是更清楚地顯示了發生了什么。 請注意,ECMAScript時區偏移量以分鍾為單位,與UTC具有相反的含義,即,對於東部,它們為負(-),對於西部為正(+)。 因此,UTC + 05:30的偏移量表示為-330,您需要添加偏移量以“移動”日期而不是減去日期。

 var tempDate = new Date(1465171200000); var _utcDate = new Date(tempDate.getUTCFullYear(), tempDate.getUTCMonth(), tempDate.getUTCDate(), tempDate.getUTCHours(), tempDate.getUTCMinutes(), tempDate.getUTCSeconds()); console.log('Direct conversion to Date\\ntempDate: ' + tempDate.toString()); console.log('Adjusted using UTC methods\\n_utcDate: ' + _utcDate.toString()); tempDate.setMinutes(tempDate.getMinutes() + tempDate.getTimezoneOffset()); console.log('Adjusted using timezoneOffset\\ntempDate: ' + tempDate.toString()); 

但是,我不明白您為什么要執行上述操作。 1465171200000代表一個特定的時間點(2016-06-06T00:00:00Z),針對每個客戶端時區進行調整意味着它代表具有不同時區偏移量的每個客戶端代表一個不同的時間點。

如果您從Number創建Date ,則將考慮本地時區。 但是,如果您想了解時間戳記對UTC校正后的小時數意味着什么,則可以這樣使用幫助器:

Number.prototype.toUTCDate = function () {
    var value = new Date(this);

    value.setHours(value.getHours() - (value.getTimezoneOffset() / 60));

    return value;
};

用法是:

var date = (1465171200000).toUTCDate();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM