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

37
我想使用date-fns库以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;比UTC提前3个小时。要获取您所在时区的时间,您需要往回推3个小时。虽然,这仅基于10分钟的研究。我不是日期格式化专家 :) - Wingnod
2个回答

42
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:ssXX')
// Prints "2018-09-14T23:59:59.999-0300" in Brazil (BRT)

formatISO(endOfDay(new Date()))
// Prints "2018-09-14T23:59:59.999-03:00" 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-MM-DD[T]HH:mm:ssZZyyyy-MM-DD。 在2.x版本中,语法已更改。同时请参阅支持的模式,您可以切换到您的date-fns版本。

7
范围错误:在格式化年份时,请使用 yyyy 替代 YYYY(在 YYYY-MM-DD[T]HH:mm:ssZZ 中)。 - shs
1
感谢提及,@shs!这似乎是 date-fns 2.x 中的一个重大变化,其中 Y 成为了周编号年份,而日历年份则更改为 y。在 date-fns 1.x 中,Y 表示日历年份。 - Ferdinand Prantl
1
供日后参考。 如果您阅读了 Ferdinand 的上面的答案,您会注意到他使用了 format。如果您在项目中完全相同地使用 console.log,那么输出将是这样的:2022-08-08[1659985199999]23:59:59。请注意,在日期和时间之间作为分隔符的 T 被替换为字面时间戳。要解决此问题,只需导入 formatISO 即可。 - Ali Mustafa
1
谢谢,@AliMustafa!是的,formatISO 是获取 ISO 860 输出的最简单方法。 - Ferdinand Prantl

5
format(endOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ss'Z'")

这种方法对我有用。

3
不对。这会打印带有字面量“Z”的当前本地时间。那不正确。看起来我们现在有了本地的ISO格式化函数。var formatISO = require('date-fns/formatISO'); formatISO(new Date());将给出我们想要的结果。 - ankush981

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