正如 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);