【问题标题】:JavaScript Date object always printed in America/New_York timezone?JavaScript Date 对象总是在 America/New_York 时区打印?
【发布时间】:2011-09-22 16:23:02
【问题描述】:

我的服务器发送了一个以毫秒为单位的时间戳 (Unix time / time from Epoch),该服务器使用 Joda-time 并且始终使用恒定时区“America/New_York”。在我的客户端上,我还想保证根据 America/New_York 时区显示时间。我依赖MDN Date documentation,并决定使用 new Date(milliseconds) 构造函数来实例化我的 Date 对象是最简单的。

现在是最困难的部分:我希望能够为在美国/纽约时区以外使用我的网站的客户打印时间。我知道我可以从Date object 获得getTimezoneOffset,所以现在我正在考虑根据偏移量对该对象执行算术运算,并依靠服务器来告诉我我是否在 DST 中。使用this method from the Joda Time library

我想要一个适用于 IE8 以及现代浏览器的解决方案。有什么想法吗?是否有任何小型实用程序已经以标准方式完成此任务?

// dateTimeAsString is sent from the server (via JSON) as a String
// dateTimeAsString example: "1311387300000"
var dateTimeAsInt = parseInt(dateTimeAsString,10);
var dateTimeInNY = new Date(dateTimeAsInt);

// My current offset is 240
var nyOffset = dateTimeInNY.getTimezoneOffset();

// Somewhere out west
var dateTimeInTexas = new Date(dateTimeAsInt);


var isDST = false; // sent from server


// What I want to do, this is not legal JavaScript
dateTimeInTexas.printWithOffset(isDST,nyOffset);

【问题讨论】:

    标签: java javascript timezone jackson jodatime


    【解决方案1】:

    浏览器没有时区信息。它们只能以 UTC 和当前操作系统时区显示。甚至不能保证客户对“美国/纽约”时区有任何了解(例如,性能不佳、性能不佳的移动设备)。

    如果您想在特定时区显示日期,最简单的方法是将其转换为格式化字符串并将其作为字符串传输,而不是毫秒。

    如果你需要在客户端做一些日历计算,那你就倒霉了……你必须手动去做。

    顺便说一句,您不能按原样使用 timezoneOffset,因为特定日期可能会有所不同,DST 也很重要。

    所以,首先。你想在客户端对日期做什么?

    【讨论】:

    • 您好,感谢您的回答。客户端的Date 对象将用于许多事情,但我的要求之一是我可以将它传递给jQuery plugin I'm using,它需要一个常规的Date 对象。我可能会更改服务器,以便它通过日、月、年、小时、分钟、秒 - 我只是认为这是矫枉过正。传递单个字段是我可以保证使用我想要的显示制作Date 对象的唯一方法吗?即我可以显示 2011-09-22 12:48PM 和硬编码时区信息
    • 在这种情况下,您应该传输日期部分(ISO-8601 是不错的选择),然后使用日期选择器,这样在客户端使用哪个时区并不重要,然后按原样传输选择的字符串并在服务器端使用 New_York 时区解析它。并明确告诉用户所有日期都在这个时区。
    • 我记得我已经研究了他们的 tz 实现的 GWT 源代码 - 哇,这很多!此外,它确实包含相当大的 tz 信息表。
    • 是的,我会明确告诉用户所有值都在America/New_York 时区(这实际上是客户要求)。我担心的只是我不想写所有这些额外的行来以细粒度的方式序列化/反序列化字段。我认为解决方案可能只是发送单独的字段并使用new Date(year, month, day [, hour, minute, second, millisecond ]) 构造函数来创建我的对象。
    • 我建议您在服务器端使用 ISO-8601 格式化程序来字符串(jodatime 有一个)。在客户端,您必须将字符串从字符串转换为 js Date 对象并返回(也许 jQuery 中已经有一些代码,我不知道)。总之,ISO 格式很容易解析和格式化。
    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2020-06-28
    相关资源
    最近更新 更多