首页 > 解决方案 > 无效的日期出现在 Firefox 中 nodejs 的控制台中

问题描述

我正在尝试将日期格式转换为 javascript 中的另一种格式。

当前格式:2021 年 3 月 17 日,下午 2:23:24 所需格式:2021-03-17T14:23:24.000Z

如何在javascript中做到这一点?

在 chrome 中,使用 new Date() 可以正常工作,但在 Firefox 浏览器中无法正常工作。

标签: javascriptnode.jsdatedatetime

解决方案


您可以将字符串解析为 Date 然后使用toISOString,但请注意内置解析器,请参阅为什么 Date.parse 给出不正确的结果?. 请注意,这也会将字符串解析为本地字符串,然后生成 UTC 时间戳。

或者,您可以手动解析字符串并重新格式化部分,它已经是 UTC,或者将其解析为本地并生成 UTC 时间戳,例如

// No Date object
// Reformat  3/17/2021, 2:23:24 PM as ISO 8601 assuming input is UTC
function reformatDate0(d) {
  let [M, D, Y, h, m, s, ap] = d.trim().split(/\W+/);
  let z = n => ('0'+n).slice(-2);
  return `${Y}-${z(M)}-${z(D)}T${z((h%12) + (/am/i.test(ap)?0:12))}:${m}:${s}.000Z`;
}

console.log('0: ' + reformatDate0('3/17/2021, 2:23:24 PM'));

// Using a Date object, values as UTC
// Reformat  3/17/2021, 2:23:24 PM as ISO 8601 assuming input is UTC
function reformatDate1(d) {
  let [M, D, Y, h, m, s, ap] = d.trim().split(/\W+/);
  return new Date(
    Date.UTC(Y, M-1, D, (h%12) + (/am/i.test(ap)?0:12), m, s)
  ).toISOString();
}

console.log('1: ' + reformatDate1('3/17/2021, 2:23:24 PM'));

// Using a Date object, values as local
// Reformat  3/17/2021, 2:23:24 PM as ISO 8601 assuming input is local
function reformatDate2(d) {
  let [M, D, Y, h, m, s, ap] = d.trim().split(/\W+/);
  return new Date(Y, M-1, D, (h%12) + (/am/i.test(ap)?0:12), m, s).toISOString();
}

console.log('2: ' + reformatDate2('3/17/2021, 2:23:24 PM'));

请注意,前两个将输入视为 UTC,最后将其视为本地,因此时间会根据输入日期和时间的主机时区偏移量进行偏移。


推荐阅读