好的,所以我的网站允许人们存储他们的工作时间表。 他们输入班次开始日期时间和结束日期时间。 很简单,对吧?
我的想法是我可以看看这个网站,看到鲍勃今晚4点到6点在芝加哥工作,乔晚上8点到10点在纽约工作。 这就是我希望在应用程序中显示的日期。 如果我从加利福尼亚查看该网站,我仍然想为鲍勃显示芝加哥时间,为乔显示纽约时间。 我不想将这些时间转换为加利福尼亚时间,在那里它会显示鲍勃从下午 2 点到 4 点工作,乔从下午 5 点到 7 点工作。
我的网站有示例数据,当所有内容都位于同一时区时,这很好,但我现在已经将其部署到美国中北部的 Azure 服务器(它也使用位于那里的 SQL Azure,尽管我不清楚在哪里),现在日期和时间都关闭了(向前跳了 7 小时)。
我相信这样做的原因是我使用了很多Ajax和JSON,而JSON要求日期时间的格式像这样/Date(1240718400000)/,其中数字表示自epoch/Unix时间以来的毫秒数。 我在日历/周/或日视图中显示计划,这需要大量的 javascript 日期时间比较。
无论如何,有人知道做我需要做的事情的正确方法吗? 我想我需要将日期时间存储为 UTC,但我还需要知道用户工作班次将发生的时区,然后我需要在 C# 端调整它,但是我需要在 javascript 端做任何事情吗?
我只是很困惑,目前似乎有太多的变量无法缠绕我的头。
我认为你走在正确的轨道上。
对于在多个时区中访问的任何 Web 应用程序,第一个经验法则是以 UTC 格式存储时间,因为以 UTC 格式存储日期/时间值的主要优点是,它通过提供一个通用的参考点使数据可传输,通过该参考点,所有时区都从中偏移。
在您的情况下,最好存储用户时区,以便您可以根据此信息呈现时间。
读取 UTC 日期/时间和用户时区时,可以直接在 C# 代码中计算此值,并将此数据作为常规字符串传递到视图,或者因为这实际上用于用户的数据而不是日期。如果您使用的是JS,请不要执行以下操作,因为它将根据用户浏览器区域设置设置时间,而是说仅作为字符串传递:
var datetime = new Date('May 29, 2012 2:52 AM UTC');
var formattedDateTime = dt.toLocaleString();