将 date/time 格式从 Etc/GMT 转换为 ISO

Convert date/time format from Etc/GMT to ISO

我需要转换 date/time 个值。

例如,我想将此 "2019-11-21 09:53:10 Etc/GMT" 转换为与此 "2020-02-13T15:24:47.977Z" 具有相同格式的值。

如果您可以提供给定示例的等效结果值,我可以将其作为参考,这样我就可以找到正确的转换代码。

否则,如果您能提供准确的 javascript 转换代码,那就更好了。我正在使用 'moment' 和 'moment-timezone'.

试试这个

 var d = new Date(); 
 var n = d.toUTCString();

你可以在这里参考https://www.geeksforgeeks.org/how-to-convert-a-javascript-date-to-utc/

您只需按此格式传递您的日期字符串 2019 11 21 09:53:10 GMT

let date = new Date('2019 11 21 09:53:10 GMT');
console.log(date.toISOString());

正如 Nitesh 在他的回答中评论的那样,当偏移量为零或 GMT+0 时,Etc/GMT 与 GMT 相同。如果我一开始就意识到这一点,我可能不会问这个问题。

我尝试了以下方法,结果为“2019-11-21T09:53:10.000Z”。

    let date1 = new Date('2019 11 21 09:53:10 GMT+0');
    console.log(date1.toISOString());

    let date2 = new Date('2019 11 21 09:53:10 GMT');
    console.log(date2.toISOString());

    let date3 = new Date('11/21/2019 09:53:10 GMT+0000');
    console.log(date3.toISOString());

    let date4 = new Date('11/21/2019 09:53:10 GMT');
    console.log(date4.toISOString());

如果我使用包含“-”和 'Etc/' 的原始样本值,转换将无法进行。

以下也将结果为“2019-11-21T09:53:10Z”

    let date5 = moment.tz("2019-11-21 09:53:10", "Etc/GMT+0");
    console.log(date5.format());

    let date6 = moment.tz("2019-11-21 09:53:10", "Etc/GMT+0");
    console.log(date6.utc().format());

    let date7 = moment.tz("2019-11-21 09:53:10", "Etc/GMT");
    console.log(date7.format());

    let date8 = moment.tz("2019-11-21 09:53:10", "Etc/GMT");
    console.log(date8.utc().format());

我没有找到任何不改变原始值的解决方案。所以我需要在创建 Date 对象之前先修改原始值。

    let a = "2019-11-21 09:53:10 Etc/GMT";  // sample value
    let b = a.replace(/-/g, " ").replace("Etc/", ""); // result: "2019 11 21 09:53:10 GMT"
    let c = new Date(b);
    console.log(c.toISOString()); // 2019-11-21T09:53:10.000Z

或者,不创建新的 Date 对象也是我可以接受的。

    let d = "2019-11-21 09:53:10 Etc/GMT";  // sample value
    let b = d.replace(" Etc/GMT", "Z").replace(" ", "T"); // result: "2019-11-21T09:53:10Z"
    console.log(b); 

"2019-11-21 09:53:10 Etc/GMT" 不是 ECMA-262 支持的格式,因此解析依赖于实现并且不能依赖,例如在 Safari 中:

new Date("2019-11-21 09:53:10 Etc/GMT");

returns 无效日期。

如果您只想将“2019-11-21 09:53:10 Etc/GMT”转换为 ECMA-262 也支持的有效 ISO 8601 格式,则无需完全没有日期对象,只需稍微重新格式化字符串即可。

let timestamp = '2019-11-21 09:53:10 Etc/GMT'
let iso = timestamp.substr(0, 19).replace(' ','T') + 'Z';

console.log(iso);

// or more tolerant of time part
let timestamp2 = '2019-11-21 09:53:10.123 Etc/GMT'
console.log( timestamp2.replace(' ','T').replace(/ Etc.*$/,'Z') );

// Or
console.log( timestamp2.split(' ').slice(0,2).join('T') + 'Z');

// Or
let [d, t, rest] = timestamp2.split(' ');
console.log(`${d}T${t}Z`);

有很多方法可以在不转换为日期再转换回字符串的情况下重新格式化字符串。当然如果你有这样的字符串:

'2019-11-21 09:53:10 Etc/GMT-4'

然后您将需要手动解析它以获得 UTC,因为 "Etc/GMT" 偏移量与普通偏移量具有相反的含义(即它们是 +ve west 和 -ve east)。