Я уже рассмотрел несколько вопросов на похожие темы, но ни один из них не касается расчета часового пояса пункта назначения с учетом его летнего времени (летнего времени). Я пытаюсь написать простой виджет, который отображает текущее местное время определенного часового пояса для всех, кто посещает страницу. Интересующий часовой пояс — BST (что такое 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, сделав паузу в отладчике и изменив месяц текущей даты, и вывод был на час позже, поэтому, похоже, он работает правильно. Спасибо за вашу помощь всем!
Europe/London
. Идея преобразования в BST заставила бы меня подумать, что вам нужен только UTC + 1, даже если BST не действует. - person Matt Johnson-Pint   schedule 16.01.2016m/d/y
, но в Великобритании они используютd/m/y
. - person Matt Johnson-Pint   schedule 16.01.2016(date >= begin && date < end)
. Кроме того, время меняется в 1:00 UTC, а не в полночь, и убедитесь, что вы работаете только с датами с 1981 года. До этого правила перехода на летнее время были другими. (См. исходники tzdb или timeanddate.com, если вам нужны все подробности.) - person Matt Johnson-Pint   schedule 16.01.2016date
на самом деле происходит откуда-то еще (например, из базы данных), тогда вы можете просматривать старые данные за предыдущий год, и в этом случае даты, которые вы выбрали для перехода на летнее время в этом году, не помогут. (начинаем понимать, почему библиотека может быть лучшим вариантом? Если нет, подумайте, что происходит в других часовых поясах, например, в южном полушарии, где переход на летнее время превышает границу года) - person Matt Johnson-Pint   schedule 16.01.2016