【发布时间】:2016-04-21 12:47:13
【问题描述】:
我已经查看了一些关于类似主题的问题,但没有一个涉及计算目的地时区,考虑到其 DST(夏令时)。我正在尝试编写一个简单的小部件,向访问该页面的任何人显示特定时区的实时本地时间。感兴趣的时区是 BST (what is BST?),但如果可能的话,我希望看到任何语言环境的通用实现。这是我的尝试,使用原生 JavaScript:
function getBST() {
var date = new Date(),
utc = date.getTime() + date.getTimezoneOffset() * 60000,
local = new Date(utc), // this is GMT, not BST
day = local.getDate(),
mon = local.getMonth() + 1,
year = local.getFullYear(),
hour = local.getHours(),
minute = ('0' + local.getMinutes()).slice(-2),
second = ('0' + local.getSeconds()).slice(-2),
suffix = hour < 12 ? 'AM' : 'PM';
hour = (hour - 24) % 12 + 12;
return mon + '/' + day + '/' + year + ', ' + hour + ':' + minute + ':' + second + ' ' + suffix;
}
setInterval(function () {
document.body.textContent = getBST();
}, 1000);
根据@RobG 的回答,我编写了以下代码:
function resetDay(date) {
date.setUTCMilliseconds(0);
date.setUTCSeconds(0);
date.setUTCMinutes(0);
date.setUTCHours(1);
return date;
}
function lastDay(date, day) {
while (date.getUTCDay() !== day) {
date.setUTCDate(date.getUTCDate() - 1);
}
return date;
}
function adjustDST(date, begin, end) {
if (date >= begin && date < end) {
date.setUTCHours(date.getUTCHours() + 1);
}
return date;
}
function updateBST() {
var date = new Date();
var begin = resetDay(new Date());
begin.setUTCMonth(3, -1);
begin = lastDay(begin, 0);
var end = resetDay(new Date());
end.setUTCMonth(10, -1);
end = lastDay(end, 0);
date = adjustDST(date, begin, end);
var day = date.getUTCDate(),
mon = date.getUTCMonth() + 1,
year = date.getUTCFullYear(),
hour = date.getUTCHours(),
minute = ('0' + date.getUTCMinutes()).slice(-2),
second = ('0' + date.getUTCSeconds()).slice(-2),
suffix = hour < 12 ? 'AM' : 'PM';
hour = (hour - 24) % 12 + 12;
return mon + '/' + day + '/' + year + ', ' + hour + ':' + minute + ':' + second + ' ' + suffix;
}
setInterval(function () {
document.body.textContent = updateBST();
}, 1000);
我通过在调试器中暂停并更改当前日期的月份来测试 BST,输出是一个小时后,所以它似乎可以正常工作。感谢大家的帮助!
【问题讨论】:
-
我建议查看像 Moment 和 Moment Timezone 这样的库。 JavaScript 中的日期和时区是出了名的难,编写自己的日期和时区很容易出错。
-
@MikeMcCaughan—“JavaScript 中的日期和时区是出了名的难……”。不,他们不是,只是有很多糟糕的信息,人们没有花时间去理解它们。日期是非常简单的对象。
-
所以,如果它们不是那么难,请回答问题:P。请注意,在纯 JavaScript 中,无需参考外部库。
-
@MikeMcCaughan——我现在没有时间写代码,但我已经有了答案。我大约 10 小时后回来。
-
为了迂腐,让我说“BST”具体是 UTC+1。英国有时在英国夏令时,有时在格林威治标准时间。如果您尝试协调单个时区的转换,您可以将其称为英国时间或伦敦时间。 IANA 使用
Europe/London标识符。 “转换为 BST”的想法会让我觉得你只想要 UTC+1,即使 BST 没有生效。
标签: javascript date dst timezone-offset