我得承认,我写这篇文章的部分原因是因为我经常需要用到它,并且希望下次能方便地找到它。使用 JavaScript 格式化从 API 获取的日期字符串可以有很多方式——从加载整个 Moment.js 以实现精确控制,到只用几行代码来更新它。本文并非旨在涵盖所有内容,而是旨在展示最常见的可读性路径。
ISO 8601 是一种非常常见的日期格式。末尾的“Z”表示 ISO 8601 格式的时间使用的是 UTC 标准,即没有时区。以下是一个示例:2020-05-25T04:00:00Z
。当从 API 获取数据时,它通常采用 ISO 8601 格式。
如果我想将上面的字符串格式化为更易读的格式,例如 **2020 年 5 月 25 日**,我会这样做
const dateString = '2020-05-14T04:00:00Z'
const formatDate = (dateString) => {
const options = { year: "numeric", month: "long", day: "numeric" }
return new Date(dateString).toLocaleDateString(undefined, options)
}
我的操作如下…
首先,我传入我希望输出格式化的选项。我们可以在其中传入 许多其他选项 以不同方式格式化日期。我只展示了一个比较常见的例子。
const options = { year: "numeric", month: "long", day: "numeric" }
接下来,我创建了一个新的 Date
实例,它代表平台独立格式中的某个时间点。
return new Date(dateString)
最后,我使用 .toLocaleDateString()
方法应用格式化选项。
return new Date(dateString).toLocaleDateString(undefined, options)
请注意,我传入的是 undefined
。在这种情况下,不定义该值意味着时间将由默认区域设置表示。您也可以将其设置为某个区域/语言。或者,对于国际化的应用程序和网站,您可以传入用户选择的区域设置(例如,美国的 'en-US'
,德国的 'de-DE'
等等)。有一个不错的 npm 包,其中包含更多区域设置及其代码的列表。
希望这能帮助您入门!并且向未来的萨拉致敬,让她不再需要在多个地方查找这个信息。🤚
您是如何传递 dateString 的?还是我漏掉了什么?
将
dateString
变量作为参数传递给formatDate
函数:formatDate(dateString)
UTC 不是一种格式,而是一种时间标准。您指的是 ISO 8601 格式。末尾的“Z”表示 ISO 8601 格式的时间使用的是 UTC 标准,即没有时区。
是我的错误,谢谢您!已更新。
很棒的文章!简洁明了。
自从 Intl 在 JS 中可用后,我一直在更多地使用它。有很多控制权,尤其是对于国际化需求来说,可以轻松更改多种选项。
MDN – https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat
我本来以为会看到用 CSS 实现这个技巧的方法。
我的意思是,如果您在网站上有一个标签,您可以使用 JavaScript 添加日期的本地化版本,以及这个作为后备的 CSS
time:empty:after {
content: attr(datetime);
}
我发现,如果我的语言不是浏览器的默认语言,有时将 undefined 传递给区域设置可能会导致使用错误的区域设置,因此我确保传递 navigator.languages(如果需要 IE11 支持,则为 navigator.languages || navigator.language)。
谢谢您,萨拉!我刚将这个标签添加了书签,这样我就不用再到处查找了 :)
它甚至支持波斯日历和数字。示例
https://gist.github.com/unicornist/0e37b3691551c42c716e96c125b99df7
IntlDateTimeFormat 确实非常有用。此外,我推荐使用
date-fns
库 https://date-fns.org/它也是基于这些库的,还包含一些其他有用的方法,用于添加/减去天数等等。
我要将它添加书签,向我自己致敬!