@Urukhayy

Можно ли в Date хранить некорректное время?

В поисках ответа на вопрос "Как получить время в любом другом часовом поясе из Date", на англоязычном сайте вопросов, наткнулся на интересную версию ответа. Там предлагается полностью игнорировать часовой пояс, который делает Date, и предлагают следующее решение, которое приведено ниже:

function calcTime(city, offset) {
    // create Date object for current location
    var d = new Date();

    // convert to msec
    // subtract local time zone offset
    // get UTC time in msec
    var utc = d.getTime() - (d.getTimezoneOffset() * 60000);

    // create new Date object for different city
    // using supplied offset
    var nd = new Date(utc + (3600000*offset));

    // return time as a string
    return "The local time for city"+ city +" is "+ nd.toLocaleString();
}

alert(calcTime('Bombay', '+5.5'));


То есть полностью игнорируется сдвиг часового пояса, который стоит в конце строки. И вызывая в разных браузерах эту функцию, метод new Date теперь не будет сам преобразовывать в локальное время. Можно ли так хранить время и дату? Правильно ли это?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
@deadem
Нельзя.

Первая проблема этой реализации в том, что во-первых, в минуте может быть не 60000 миллисекунд.
https://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BA%D...

Вторая в том, что мы прибавляем к UTC (new Date) время в часах (3600000), а потом получаем время для текущей (toLocaleString) временной зоны, а не для той, для которой мы считаем время. Если у человека, который запускает этот код в этот диапазон попадёт переход на зимнее-летнее время, то результат она выдаст неправильный, так как Date сконвертирует даты для текущей локали, а не для той, смещение для которой передали.

И более того - нельзя вообще указывать смещение относительно UTC в часах именно из-за зимнего-летнего времени, обязательно нужно знать страну и город. Переходы на зимнее-летнее время - это вообще дичь какая-то, для каждого города могут быть свои собственные правила перевода часов, которые, к тому же, периодически меняются. Поэтому в операционных системах таскают с собой огромные справочники для правильного вычисления локального времени.

Вот, для примера, что в одной только России творилось со временем за последние 100 лет: https://www.worldtimezone.com/dst_news/dst_news_ru...

Предложенная функция почти всегда она будет возвращать правильный результат, но иногда будет ошибаться. Поэтому зависит от целей использования. Для финансовой документации её использовать нельзя. А для вывода текущего времени на сайте - почему бы и нет.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы