设置JavaScript倒计时到太平洋标准时间午夜结束?

时间:2013-07-16 08:03:12

标签: javascript timezone datejs

我想在周一@太平洋标准时间午夜结束倒计时。我以为我一周前工作了,但显然没有。

我正在使用date.js

var monday = Date.today().next().monday();
var UTCmonday = new Date(monday.getTime() + monday.getTimezoneOffset() * 60000);
var PSTmonday = new Date(UTCmonday.setHours(UTCmonday.getHours() + 9));
$('#defaultCountdown').countdown({until: UTCmonday});

我认为问题在于确定UTC时间?我对吗?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

假设您有太平洋标准时间,那么您需要记住PST === UTC-8

因此,你的第三行将是

var PSTmonday = new Date(UTCmonday.setHours(UTCmonday.getHours() - 8));

问题在于,如果UTC早于早上8点,则会失败,因为您无法将负数传递到setHours

由于您使用的是Datejs,为什么不使用其全部功能来更改时区?

http://code.google.com/p/datejs/wiki/APIDocumentation#setTimezone

答案 1 :(得分:0)

在PST中严格控制时间没有多大意义,因为在太平洋时区没有观察到PST的近半年。在冬季观察到PST(UTC-8),在夏季观察到PDT(UTC-7)。您不能将太平洋时间仅仅表示为固定偏移量,除非它恰好是您自己的本地时区,否则您无法在没有时区数据库的情况下轻松确定它们之间的转换。请参阅the timezone tag wiki

此外,date.js has been abandoned。我不推荐任何继续使用它的解决方案。对Dancrumb建议的setTimezone方法的支持是针对特定文化的,并且它仍然没有考虑夏令时。

相反,我建议您尝试moment.js。您可以使用moment-timezone插件来处理America/Los_Angeles区域 - 这是美国太平洋时间的一个很好的范例。确保您的moment-timezone-data.js文件至少包含此区域。然后,您可以执行以下操作:

var m = moment().tz('America/Los_Angeles').day(7).startOf('day');

var s = m.toISOString();  // if you need a string output representing UTC
var dt = m.toDate();      // if you need an actual JavaScript Date object

让我们稍微打破一下:

  • moment()为您提供当前时间
  • tz('America/Los_Angeles')调整您感兴趣的时区的时间。
  • day(7)将时间提前到 next 星期一。
  • startOf('day')将时间缩短到午夜。