【问题标题】:Convert date/time format from Etc/GMT to ISO将日期/时间格式从 Etc/GMT 转换为 ISO
【发布时间】:2020-06-03 20:52:21
【问题描述】:

我需要转换日期/时间值。

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

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

否则,如果您可以提供准确的 javascript 代码进行转换,那就更好了。我正在使用“时刻”和“时刻-时区”。

【问题讨论】:

  • 我投反对票,因为这里没有尝试。您实际上是在告诉我们编写您的代码。我建议您编写自己的格式化程序,如果您不能这样做,请发布您的工作,我们可以根据需要查看和扩充它。
  • 我在问题中建议有人可以给出正确的结果值就足够了,而且我已经可以编写我的代码了。现在我可以编写转换代码,但我不确定结果值是否正确。
  • 你要找的和你要问的不一样,当你的问题得到回答后,你不问后续问题,浪费别人宝贵的时间,而你却没有付出任何努力
  • @eboakyegyau 当我看到您的回答时,我确实立即对您的回答提出了后续问题。也许我稍后也会对您的答案投反对票。 ;)

标签: javascript date utc


【解决方案1】:

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

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

返回一个无效的日期。

如果您只想将“2019-11-21 09:53:10 Etc/GMT”转换为 ECMA-262 也支持的有效 ISO 8601 格式,则根本不需要 Date 对象,只需稍微重新格式化字符串。

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 和 -veeast)。

【讨论】:

  • 我提供的样本值 '2019-11-21 09:53:10 Etc/GMT' 来自 Apple 服务器。我还不确定苹果是否有机会在额外的毫秒内给出类似“2019-11-21 09:53:10.45 Etc/GMT”的内容。在这种情况下,这个答案将丢弃额外的毫秒。但是,这个答案也适用于我的用例。
  • @d_air — 已更新。关键是您可以相当简单地重新格式化字符串,而不必费心解析为 Date 然后格式化涉及的各种问题。
【解决方案2】:

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

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

【讨论】:

  • Etc/GMT 和 GMT 一样吗?
  • 它们仅在偏移量为 0 时表示同一时刻。stackoverflow.com/questions/7303580/…
  • 我实际上是从苹果服务器上得到这个日期的。让我感到困惑的一件事是 Etc/GMT。通常时间格式是这样的 Etc/GMT+1 但来自 Apple 的值只有 Etc/GMT。所以这让我很困惑如何转换它。
  • 我想,我会接受你的回答。但我会先验证一切。谢谢。
  • @NiteshPhadatare——这不是“正确的方法”。 ECMA-262 不支持该格式,Safari 无法正确解析。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    试试这个

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

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

    【讨论】:

    • 即使答案格式正确。我如何知道日期/时间值是否正确?
    • 首先,您打算如何获取日期/时间?正确或错误的时间仅取决于您的参考时钟是什么。
    • 您的问题只是关于时间的转换,因此可能需要改写为您需要回答的确切内容
    • 上面给出的例子对我来说已经足够了。我得到了确切的字符串值。我想转换它。但我不确定我的转换结果是否正确。
    • 如果这对您来说是正确的,您可以接受它,但您的时间是否正确取决于您从哪里获取时间以及参考哪个参考时钟
    猜你喜欢
    • 2020-05-10
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2020-11-23
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多