不同语言环境和时区中的Javascript日期对象

不同语言环境和时区中的Javascript日期对象,javascript,datetime,timezone,dst,Javascript,Datetime,Timezone,Dst,我需要编写一个web应用程序来显示不同地区的人的事件。我几乎完成了,但日期有两个问题: 使用date javascript对象,日期取决于用户计算机设置,因此不可靠 如果在一个不同时区的地方发生了事件,那么我必须在()中打印它。在javascript中是否可以使用给定的时区和日光设置构建日期对象 我还找到了一些解决方法,如jsdate和date webservices,但它们无法克服javascript对象具有正确时区和日光设置的问题(用于日期操作,如添加天数等)。一种可能是对所有内容使用U

我需要编写一个web应用程序来显示不同地区的人的事件。我几乎完成了,但日期有两个问题:

  • 使用date javascript对象,日期取决于用户计算机设置,因此不可靠
  • 如果在一个不同时区的地方发生了事件,那么我必须在
    ()
    中打印它。在javascript中是否可以使用给定的时区和日光设置构建日期对象

我还找到了一些解决方法,如jsdate和date webservices,但它们无法克服javascript对象具有正确时区和日光设置的问题(用于日期操作,如添加天数等)。

一种可能是对所有内容使用UTC日期和时间。这样,就没有什么可转换的了


另一种方法是让服务器提供时间和日期。这样,您就不必依赖用户来正确设置它,也不必担心用户的时区在哪里。

您错过了日期对象的点。它代表一个特定的时间点。正如我所说,全世界的数字都是1308150623182。只有当您想向用户显示时间时,时区才会起作用。像“添加一天”这样的操作根本不涉及时区。

使用
getUTCDate()
getUTCHours()
。。。而不是
getDate()
getHours()
,。。。
getTimeOneOffset()
也可能有用。

要记住几件事

以UTC时间存储所有事件日期时间

是的,这是绕不开的

找出所有时区…

…系统中所有用户的。您可以使用以下检测脚本:。它会给你一个时区键,比如“America/Phoenix”

在您的情况下,您需要将时区与事件一起存储,因为用户可能会切换时区,但事件总是发生在特定的时区中。(啊)

选择您的显示机制

如果您想用Javascript本地化事件日期,也有一个漂亮的库(可以使用前面脚本提供的键)。此处:

例如,使用该库,您可以执行以下操作:

var dt = new timezoneJS.Date(UTC_TIMESTAMP, 'America/New_York');

例如,其中UTC_时间戳可以是
1193855400000
。而
America/New_York
是您在事件发生时检测到的时区

从中获得的
dt
对象将作为一个普通的JavaScript
Date
对象。但会自动将其自身“更正”到您指定的时区(包括DST)


如果你想,你可以在后台做所有的更正-在你提供页面之前。因为我不知道你在那里使用的是什么编程语言,所以我不能立即给你任何提示。但基本上它遵循相同的逻辑,如果您知道时区,并且UTC datetime->您可以本地化datetime。所有编程语言都有相应的库。

添加一天确实涉及时区。并非所有的日子都是24小时。根据时区、夏令时规则和所讨论的特定日期,日历日的长度可能是23、24或25小时(如果谈论历史时区,也可能是其他奇怪的值)。因此,增加86400000并不总是一个简单的问题。也许这个问题还不够明确。如果是凌晨2:30,时区向前移动的前一天,“增加一天”意味着什么?确切地说。如果你的意思是“增加24小时”,那么你很好。但大多数人认为这些转变是看不见的,因为它们发生时通常是睡着的。因此,如果你问一个外行从凌晨2:30算起1天的时间,他们会期待凌晨2:30,而不是可能的凌晨1:30或凌晨3:30。人们倾向于用日历来思考问题,即使这些日历是变化无常的@马特约翰逊——我想这就是为什么你不去问外行:他们给出了毫无帮助的答案。(我昨天参加了一个产品会议,问我们应该如何处理一个支持700000用户的系统的边缘案例,首相驳回了这个问题,说:“90%的时候,这没有发生。”我差点掐死了她。)
var dt = new timezoneJS.Date(2006, 9, 29, 1, 59, 'America/Los_Angeles');