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

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

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

我有以下疑问:

如何在SQL Server上存储时间信息(在这种情况下为10 AM)?
我应该花时间在客户端计算机上使用JavaScript,然后将其转换为UTC吗?
我是否应该使用JavaScript花费时间并保存用户时区信息?
与DST相关的更改生效后会发生什么?
像momemnt.js这样的库在这种情况下会有所帮助吗?

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

参考方案

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

您还可以查看Quartz.net,它足以满足许多情况。

要回答您的特定问题:

  
  如何在SQL Server上存储时间信息(在这种情况下为上午10点)?
  

对于重复规则,请存储事件的本地时间。 SQL Server具有time类型,可很好地存储一天中的时间。您将需要其他字段来跟踪时区,开始日期,一周中的几天以及其他模式信息。

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

  
  我应该花时间在客户端计算机上使用JavaScript,然后将其转换为UTC吗?
  我是否应该使用JavaScript花费时间并保存用户时区信息?
  

回答两个问题:对于计划,您不应丢弃原始输入,该原始输入将在计划事件的本地时区中。这可能匹配或可能不匹配用户的时区。您将需要询问用户选择事件的时区。

  
  与DST相关的更改生效后会发生什么?
  

随你(由你决定。您将需要彻底测试。通常,跳过本地时间段,并重复本地时间段。

跳过该事件时,您必须决定何时运行该事件。选项包括:1)在跳过的时间之前,2)在跳过的时间之后,以及3)根本不。在大多数情况下,首选方法是在跳过的时间之后运行,方法是通过DST偏差(通常为1小时)提前本地时间。例如,原定在太平洋时间每天2:30举行的每日活动将在春季向前过渡的当天3:30进行。
当重复该事件时,您必须决定何时运行事件。选项包括:1)在第一次出现时,2)在第二次出现时,和3)在两次出现时。在大多数情况下,首选选项是仅在首次出现时运行。例如,按计划在太平洋时间每天1:30运行的每日活动将在太平洋标准时间1:30而不是太平洋标准时间1:30进行。

例外情况包括与营业至深夜的企业打交道,并选择继续营业。例如,酒吧,餐厅或电影院。它高度依赖于特定的用例和特定企业的选择。

  
  像moment.js这样的库在这种情况下会有所帮助吗?
  

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

最大的挑战实际上是您没有谈论过的挑战,这是如何在服务器上维护时区数据。在您的C#代码中,我建议为此使用Noda Time而不是TimeZoneInfo。然后可以根据需要update the tzdb data yourself。如果时区已更改其偏移时间或夏令时日期,则还需要考虑重新计划每次事件的UTC时刻的工作流程。

javascript popupwindow之后的行如何工作? - javascript

好的,我有一个来自后面代码的方法,可以创建一个popupwindow。然后有一行代码要在那之后执行,我想知道那行代码何时执行,是在使用popupwindow之后执行还是在创建popupwindow之后执行?例如:void exPopupWindowMethod() { string scr = "window.open('exampleP…

在文本字段中键入时显示预制建议列表 - javascript

如标题所说我正在处理一个mysql项目,我希望该文本字段在键入它时向现有用户提供建议(管理员控制页以禁止用户..类似的东西)一个简单的例子来解释:当我输入文字时..我想给用户输入建议假设他正在输入颜色名称所以当他在其中输入b在他继续之前,会出现一个列表,向他提供我们预先设定的建议,例如:黑色棕色蓝色然后如果他输入l为bl该列表将是:黑色蓝色布拉布拉有什么建议…

Javascript-Urls的奇怪字符串比较行为 - javascript

最近,在编写我无法理解的javascript时遇到了字符串比较的问题。我从完全相同的网址创建了两个字符串,当我比较它们时返回false,但是在重新分配相同的字符串后,比较返回true。这是我的示例:var str1 = "http://google.com/"; var str2 = "http://google.com‏/&#…

连接JavaScript和Sql女士 - javascript

这是我知道足够的html和CSS来建立网站的项目范围。我对MS sql足够了解,可以构建存储过程和复杂的查询。我正在尝试将所有内容提升到新的水平这个问题很广泛,但我需要一些指导。如何构建基于Web的应用程序以使用JavaScript从MS Sql检索数据?现在我正在学习JavaScript,我只知道非常基础的知识,但是只要我能理解这个项目,我就很to昧地学习…

Javascript-从当前网址中删除查询字符串 - javascript

单击提交按钮后,我需要从网址中删除查询字符串值。我可以用jQuery做到这一点吗?当前网址:siteUrl/page.php?key=value 页面提交后:siteUrl/page.php 实际上,我已经从另一个带有查询字符串的页面着陆到当前页面。我需要在页面首次加载时查询字符串值以预填充一些详细信息。但是,一旦我提交了表格,我就需要删除查询字符串值。我已…