使用 ISO-8601 格式的 date-fns 获取当前日期

Posted

技术标签:

【中文标题】使用 ISO-8601 格式的 date-fns 获取当前日期【英文标题】:Get the current date using date-fns in ISO-8601 format 【发布时间】:2019-02-19 09:58:47 【问题描述】:

我想使用 date-fns lib 获取从当天开始的最后一小时:分钟:秒的 ISO-8601 格式:

我正在使用: endOfDay(new Date());

Fri Sep 14 2018 23:59:59 GMT-0300

所以添加 toISOString() 以获取 ISO 格式: endOfDay(new Date()).toISOString()

结果: 2018-09-15T02:59:59.999Z

当我需要时:

2018-09-14T23:59:59.999Z

【问题讨论】:

我相信这是因为您的日期是 UTC。也许尝试计算时区偏移量,并将其应用于您的日期会起作用。例如,您是 GMT-0300;比世界标准时间早 3 小时。要获得您所在时区的时间,您需要返回三个小时。虽然,这一切都是基于 10 分钟的研究。我不是日期格式专家:) 【参考方案1】:

2018-09-14T23:59:59.999Z 不是endOfDay(new Date()); 计算的一天结束。时间提前了 3 小时。 “Z”表示 UTC,您的本地时区与 UTC -0300 有偏移。

通过执行endOfDay,您将获得一个日期值,您可以将其用于与其他日期值进行比较和其他计算。这是一个带有本地时区时间的完整日期。

您想在格式化字符串中保留同一天数吗?您可以将日期格式化为您当地时区的 ISO 8601 字符串:

format(endOfDay(new Date()), 'yyyy-MM-DD[T]HH:mm:ssZZ')
// Prints "2018-09-14T23:59:59.999-0300" in Brazil (BRT)

您想以与今天相同的 UTC 数字结束一天吗?如果您忽略与其他日期相关的一天的实际结束,您可以将“一天的最后一秒”与“Z”连接起来:

format(new Date(), 'yyyy-MM-DD') + 'T23:59:59.999Z'
// Prints "2018-09-14T23:59:59.999Z" anywhere on Earth

注意:如果您使用 date-fns 1.x,请将上述模式中的 yyyy 替换为 YYYY。另请参阅下面的 cmets。

【讨论】:

RangeError: 使用yyyy 而不是YYYY(在YYYY-MM-DD[T]HH:mm:ssZZ 中)格式化年份... 感谢您提及这一点,@shs!这似乎是 date-fns 2.x 中的一个重大变化,其中 Y became the week-numbering year,而日历年更改为 yY 表示日历年 in date-fns 1.x。

以上是关于使用 ISO-8601 格式的 date-fns 获取当前日期的主要内容,如果未能解决你的问题,请参考以下文章

使用具有 ISO 8601 格式的“DateTime.LocalNow”

iOS-时间格式ISO 8601

如何使用 PHP 将日期显示为 iso 8601 格式

ISO 8601 和 RFC 3339 日期格式有啥区别?

将 Luxon 日期格式化为 ISO8601 基本格式

如何使用 ISO 8601 格式的 DateTime 字段将 JSON 文本反序列化为 BsonDocument?