如何将具有特定语言环境的日期字符串转换为ISO格式

4

我希望将一个特定语言环境(以IANA格式定义)的日期时间字符串转换为Date对象,并以ISO 8601格式打印UTC时间。以下代码完美运行。

<script src="https://momentjs.com/downloads/moment.min.js"></script>
<script src="https://momentjs.com/downloads/moment-timezone-with-data.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', ()=>{
   console.log(moment('2021-01-01T00:00:00').tz('America/New_York').toISOString());
});
</script>

结果是我的控制台日志显示2021-01-01T05:00:00.000Z

然而,我想在不使用任何第三方库的情况下实现相同的结果。我只想使用浏览器的JavaScript默认对象/类/API等……所以我尝试了所有这些方法,但它们都出现了错误:

   new Date("2021-01-01T00:00:00 America/New_York").toISOString();
   (new Date("2021-01-01T00:00:00")).setLocale('America/New_York').toISOString();
   (new Date("January 1, 2021 12:00:00 AM America/New_York").toISOString();

如何在javascript中以正确的方式将带有区域设置的日期字符串转换为ISO 8601格式,而不使用moment、luxon等javascript库?

我需要它能够在2021年1月1日之后发布的任何桌面版Chrome、FireFox、Edge和Safari中运行(不需要支持旧版本)。

2个回答

4
利用这个StackOverflow答案提供的帮助,可以按照以下步骤完成。你已经接近成功了。 toLocaleString() 是你需要的方法。正如其名称所示,它返回一个字符串,因此需要将其转换回日期对象。我认为这样做的笨重性是为什么很多人更喜欢使用像moment这样的库的原因。
new Date(
  new Date("2021-01-01T00:00:00")
    .toLocaleString("en-US", {timeZone: "America/New_York"})
).toISOString();

2
这只有在你当前的时区也是美国/纽约时才能起作用,日期将根据您本地的时区解析(不带TZ数据)。 - dngrmice

0
你可以使用名为 Intl 的原生 JavaScript 类。
 const newDate = new Date();
console.log(new Intl.DateTimeFormat('en-us', { dateStyle: 'short', timeStyle: 'medium' }).format(newDate))

;


这并不会产生像 OP 要求的 2021-01-01T05:00:00.000Z 格式的结果。 - smoore4
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接