3 回答

TA貢獻1828條經驗 獲得超13個贊
你的問題是:
new Date('2020-09-15 11:52:22.000')
強烈建議不要對不受支持的格式使用內置解析器。它依賴于實現,并且通常在不同的實現中返回不同的結果。
此外,該字符串沒有時區,因此應被視為本地時區。因此,即使解析正確,對于具有不同偏移量的每個地點,它也會代表不同的時間點。
Date-fns 有一個功能強大的解析器,所以你應該使用它而不是內置的解析器。如果您希望將時間戳視為 UTC,最簡單的方法是添加尾隨“Z”和時區標記以進行解析。
要支持輸出時區,您必須包含date-fns-tz。以下是您可以在npm.runkit運行的一些代碼。格式部分似乎產生了正確的結果,但是如果將時區標記添加到格式字符串(即“X”或“XX”),它會顯示本地時區偏移量,而不是應用于字符串的時區偏移量,以便顯示正確偏移,你必須手動添加它(我認為這是 date-fns-tz 中的一個錯誤)。
const dateFns = require("date-fns");
const { zonedTimeToUtc, utcToZonedTime, format } = require('date-fns-tz');
let timestamp = '2020-09-15 11:52:22.000';
let tz = 'Z';
let date = dateFns.parse(timestamp + tz, 'yyyy-MM-dd HH:mm:ss.SSSX', new Date());
// Show timestamp was parsed as UTC
console.log(date.toISOString()); // 2020-09-15T11:52:22.000Z
// Produce UTC output - need to set timezone first
let utcDate = utcToZonedTime(date, 'UTC');
// Manually add timezone to formatted string
console.log(format(utcDate, 'd MMM yyyy HH:mm \'UTC\'', 'UTC')); // 15 Sep 2020 11:52 UTC
請注意,utcToZonedTime(date, 'UTC')實際上創建了一個由指定偏移量修改的新日期并將其分配給utcDate,我認為這是一個真正的問題。如果您知道它是如何被修改的,它現在才有用,您不知道它實際應該代表什么時間。在這種情況下,它可能很清楚,因為我們使用的是 UTC,但其他偏移量問題更大。
如果初始時間戳采用 ECMAScript 支持的格式,例如與toISOString生成的格式相同:2020-09-15T11:52:22.000Z,將會節省很多精力。

TA貢獻1810條經驗 獲得超4個贊
您可以嘗試這樣做(我的時區是 +2 GTM)
解析您的日期以獲得 UTC 字符串
const parsedDate = parse('2020-09-15 11:52:22.000', 'yyyy-MM-dd HH:mm:ss.SSS', new Date()).toUTCString();
// Tue, 15 Sep 2020 09:52:22 GMT
// or simply
// new Date('2020-09-15 11:52:22.000').toUTCString();
// format a new date starting from UTC format
// new Date(parsedDate) --> Tue Sep 15 2020 11:52:22 GMT+0200
const date = format(new Date(parsedDate), 'dd MMM yyyy HH:mm:ss');
格式中的新 Date(parsedDate) 會將 utc 重新轉換為您的時區
添加回答
舉報