【问题标题】:new Date () javascript not showing correct date in Pacific timezone新的 Date () javascript 未在太平洋时区显示正确的日期
【发布时间】:2013-05-31 11:24:44
【问题描述】:

以下代码在不同时区/位置的工作方式不同。

在我的办公桌上,它在印度完美运行

var sdate =  new Date("2013-12-12");
document.write(sdate)

如下图

2013 年 12 月 12 日星期四 05:30:00 GMT+0530(印度标准时间)

这是正确的。

但是,当我将相同的代码托管到我在美国的客户服务器时,它显示如下

2013 年 12 月 11 日星期三 16:00:00 GMT-0800(太平洋标准时间)

如何在客户端主机中正确显示日期?

提前致谢

【问题讨论】:

  • “正确”定义。现在它显示了同一时间段的本地表示(根据时区指示移动)。如果您想要的是本地“开始日期”点,请改用new Date('2013/12/12 00:00:00')

标签: javascript timezone date-format


【解决方案1】:

JavaScript 目前没有内置的标准对象来表示没有时间的日期。当您使用Date 对象时,尽管它的名称您应该将其视为“日期和时间”对象,更接近于其他语言所称的DateTime。总是有一个隐含的时间组件,即使您不提供。

Date 对象的构造函数有几种不同的形式,这些形式因您传入的参数而异。如果您传递一个字符串,它会尝试解析该字符串。但是,效果可能会因字符串包含的内容而异,并且可能因实现而异。

例如:

// This will be parsed as UTC at midnight (but doesn't work in IE8)
new Date("2013-05-31")

// This will be parsed as local time in Chrome, and cause "Invalid Date" in IE
new Date("2013-05-31 00:00:00")

// This will be parsed as local time at midnight, and usually works in all browsers, but is not standardized.
new Date("2013/05/31")

最后一个可能是可以接受的,但对我来说仍然很可疑。大多数人不使用这种格式,他们更有可能输入 mm/dd/yyyy 或 dd/mm/yyyy,这可能会导致根据文化和输入日期的歧义。

您最好将数字参数传递给Date 构造函数:

new Date(2013, 4, 31)

请注意,当您执行此操作时,月份会运行 0-11 而不是 1-12。因为我通过了4,所以这代表了五月。这是一个常见的错误来源,因此请仔细观察。

我还应该提到,如果您使用诸如Moment.js 之类的库,您可以消除所有浏览器变体并支持您想要的任何格式。例如:

// This will be parsed as local time
moment('2013-05-31','YYYY-MM-DD')

// This will be parsed as UTC
moment.utc('2013-05-31','YYYY-MM-DD')

还有许多其他不错的日期/时间库。如果您需要支持较旧的浏览器,那么 Moment 是一个不错的选择。但如果您主要支持现代浏览器,请尝试使用Luxondate-fns

【讨论】:

  • @RobG - 谢谢。旧答案,我更新了正确的术语。
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 2017-01-29
  • 1970-01-01
  • 2021-12-22
  • 2015-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多