微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 dayjs 为时区生成 24 小时 UTC 日期范围

如何解决使用 dayjs 为时区生成 24 小时 UTC 日期范围

我正在尝试创建一个函数,该函数使用 dayjs 在 UTC 中返回给定日期和给定时区的开始和结束时间。这些是我认为我需要的结果示例:

日期 时区 开始 结束
2021-04-15 美国/纽约 2021-04-15T04:00:00.000Z 2021-04-16T03:59:59.999Z
2021-03-27 美国/纽约 2021-03-27T04:00:00.000Z 2021-03-28T03:59:59.999Z
2021-03-13 美国/纽约 2021-03-13T05:00:00.000Z 2021-03-14T04:59:59.999Z

这是我的功能

dayjs.extend(utc);
dayjs.extend(timezone);

export const getDayRange = (date,timezone = "America/New_York") => ({
  start: dayjs.tz(date,timezone).startOf("day").utc().toISOString(),end: dayjs.tz(date,timezone).endOf("day").utc().toISOString()
});

但是,它没有输出我期望的结果,并且似乎受到当地时间的影响(因为 UTC 在 3 月 28 日偏移,这是英国而不是纽约的夏令时结束)。我已经尝试了不同结果的链式 dayjs 命令的各种组合,但都不正确。

这感觉应该是使用 dayjs 非常简单的事情,更不用说一个相当常见的用例了。但是,我正在努力让一些东西工作。

codesandbox example with tests

解决方法

事实证明,自 v.1.9.6 版以来,dayjs 中的时区存在一些问题。预计在下一个版本(1.10.5?)中进行修复:

https://github.com/iamkun/dayjs/issues/1437

我可以改用 moment(因为 API 基本相同)解决了我的问题:

export const getDayRange = (date,timezone = "America/New_York") => ({
  start: moment.tz(date,timezone).startOf("day").toISOString(),end: moment.tz(date,timezone).endOf("day").toISOString()
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。