gpt4 book ai didi

javascript - 管理 JavaScript 应用程序的时区和 DST 问题

转载 作者:行者123 更新时间:2023-12-03 08:20:34 25 4
gpt4 key购买 nike

我正在尝试创建一个调度应用程序。前端\UI是使用JavaScript开发的。后端是一个 ASP.NET Web Api 应用程序,使用 MSSQL 服务器作为数据库。从 UI 中,用户将安排一个可以每天/每周/每月运行的作业。每个作业最多可以运行 3 个月。该作业将在指定时间在服务器端运行。

假设用户来并选择一个将在本地时间上午 10 点运行一周(从 11 月 23 日到 11 月 29 日)的作业。在这种情况下,我将从 11 月 23 日开始在数据库中创建 7 个条目(每天一个)。每行都有开始时间、开始日期和一些状态相关列。

我有以下问题:

  1. 如何在 SQL Server 上存储时间信息(本例中为上午 10 点)?
  2. 我是否应该在客户端计算机上使用 JavaScript 获取时间,然后将其转换为 UTC?
  3. 我应该使用 JavaScript 获取时间并保存用户时区信息吗?
  4. 夏令时相关变更生效后会发生什么?
  5. 像 momemnt.js 这样的库在这种情况下会有帮助吗?

我正在考虑保存用户时区信息并在服务器上保存他的本地时间。

最佳答案

警告 - 正确安排时间是很困难的。还有很多事情需要考虑。请阅读thisthis 。您的大多数问题都在那里得到解决(尽管从其他语言的 Angular 来看,挑战是相同的)。

您也可以看看Quartz.net ,这对于很多场景来说已经足够了。

回答您的具体问题:

  1. How do I store time information (10 AM in this case) on SQL server?

对于重复规则,存储事件的本地时间。 SQL Server 有一个 time 类型,非常适合存储一天中的时间。您将需要其他字段来跟踪时区、开始日期、星期几和其他模式信息。

对于计划运行的特定实例,您可以根据重复规则中的所有信息计算 UTC 日期时间。至少,您安排下一次发生,并在每次运行后重新计算。在某些情况下,您可能决定预测接下来的 N 个事件,具体取决于您需要向用户显示的内容。 (您还可以使用 datetimeoffset 来实现此目的。请参阅 datetime vs datetimeoffset。)

  1. Should I get the time using JavaScript on client machine and then convert the same to UTC?
  2. Should I get the time using JavaScript and also save the user time zone information?

回答这两个问题:对于安排,您不应丢弃原始输入,该输入将采用所安排事件的本地时区。这可能与用户的时区匹配,也可能不匹配。您需要要求用户选择事件的时区。

  1. What happens when DST related changes take effect?

这取决于你。您需要对此进行彻底测试。一般来说,有一段本地时间被跳过,也有一段本地时间被重复。

  • 当它被跳过时,您必须决定何时运行该事件。选项包括:1) 在跳过的时间之前,2) 在跳过的时间之后,以及 3) 根本不。在大多数情况下,首选选项是在跳过的时间之后运行,将本地时间提前 DST 偏差(通常为 1 小时)。例如,计划在太平洋时间每天 2:30 运行的每日事件将在 Spring 向前过渡当天的 3:30 运行。

  • 当重复时,您必须决定何时运行该事件。选项包括:1) 第一次出现时,2) 第二次出现时,以及 3) 两次出现时。在大多数情况下,首选选项是仅在第一次出现时运行。例如,计划在太平洋时间每天 1:30 运行的每日事件将在太平洋夏令时间 1:30 运行,而不是太平洋标准时间 1:30。

    • 异常(exception)情况包括营业至深夜并选择重复营业的企业。例如,酒吧、餐厅或电影院。它高度依赖于具体用例和具体业务做出的选择。
  1. Will library like moment.js will help in this scenario?

从日程安排的 Angular 来看,不是。不过,它可以帮助解析、格式化和验证输入。您也可以使用moment-timezone帮助选择事件的时区。如果您在后端使用 Node.js 来运行它,那么也许会有更多好处。

<小时/>

最大的挑战实际上是您没有谈到的一个,即维护服务器上的时区数据。在您的 C# 代码中,我建议使用 Noda Time为此,而不是 TimeZoneInfo。然后您可以update the tzdb data yourself如所须。您还需要考虑在时区更改其偏移量或夏令时日期的情况下重新安排每次发生的 UTC 时刻的工作流程。

关于javascript - 管理 JavaScript 应用程序的时区和 DST 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com