Объясняю.
1.
Он хранит миллисекунды
Великолепно, пусть хранит. Вопрос: в Кемерово сейчас 9:43, а в Москве 5:43. Количество миллисекунд, с начала эпохи в Москве и в Кемерово прошло одинаковое количество? Разумеется. Это одно и то же время, только выглядит для пользователя по-разному. Поэтому, когда для
отображения времени в разных таймзонах, ты
изменяешь количество миллисекунд, ты совершаешь ошибку, ты буквально изменяешь время, о чем тебя не просили.
Что происходит на практике. Есть предприятие-заказчик в Якутии. Есть техподдержка в Москве. Техподдержка желает видеть всю ту же информацию, что и пользователь, для этого логинится под Якутией, на сервере активируется таймзона Asia/Yakutsk и казалось бы все зашибись. Но дурацкие даты в ЖС не понимают таймзоны в конструкторе, либо таймстамп, либо таймтупл. Поэтому в каком формате ты не передавай дату с сервера, ЖС создаст дату в таймзоне браузера. Это уже само по себе очень не хорошо. Но теперь мне надо заняться переводом московского времени в якутское! Вот больше делать нефиг. Но и хрен бы с ним, но если я поступлю по твоей методе, просто возьму и прихреначу пару часов к дате, то я получу
другое время (не время в таймзоне Якутии, а другое), что означает: если работник техподдержки изменит, например, начало смены на полчаса и отправит исправленный вариант на сервер, сервер получит неправильное время, либо придется заниматься какими-то преобразованиями до отправки. Если мы используем какую-то библиотеку контролов, последнее испытание превращается в тот еще квест, а если на машине пользователя таймзона выставлена неправильно (человек часто ездит в командировки) то работа со временем в браузере становится нереальной.
Всё, что нужно для исправления ситуации, это добавить поддержку таймзон в дату. Но этого нет, поэтому даты в ЖС
идиотские.2.
Ошибка №2 в том, что часовой пояс - это не смещение времени. Это смещение времени, привязанное к географическим координатам и времени абсолютному. Внезапно, отняв или прибавив N миллисекунд к дате, мы можем получить значение не существовавшее в Якутии, потому что попадем на час, выпавший из истории в момент перевода часов на летнее время. Если ты думаешь, что на этом нельзя потерять солидно денежек, ты ошибаешься.
3.
import pytz
import datetime
now = datetime.datetime.utcnow().replace(tzinfo=pytz.UTC).astimezone(pytz.timezone("Europe/Moscow"))
long_time_ago = now - datetime.timedelta(milliseconds=131400000000)
print(long_time_ago)
>>>2013-08-12 10:27:54.401089+03:00
var d = new Date()
var r = new Date(d.getTime() - 131400000000 + 3 * 3600000)
>>>Mon Aug 12 2013 17:28:19 GMT+0700 (+07)
Ты ошибся на три часа!