0

我正在尝试倒计时结束星期一@午夜 PST。我以为我一周前就可以工作了,但显然没有。

我正在使用 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时间?我对吗?我该如何解决?

4

2 回答 2

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

于 2013-08-06T23:12:05.110 回答
0

严格按照太平洋标准时间计算时间没有多大意义,因为太平洋时区几乎没有观察到太平洋标准时间。冬季观测太平洋标准时间 (UTC-8),夏季观测太平洋夏令时 (UTC-7)。您不能将太平洋时间仅表示为固定偏移量,除非它恰好是您自己的本地时区,否则如果没有时区数据库,您将无法轻松确定它们之间的转换。请参阅时区标签 wiki

此外,date.js 已被放弃。我不能推荐任何继续使用的解决方案。对 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)将时间提前到下周一。
  • startOf('day')将时间拉回到午夜。
于 2013-08-07T15:35:41.480 回答