Во-первых, давайте поговорим о коде в вашем вопросе.
let india_date = new Date()
Вы назвали эту переменную india_date
, но объект Date
будет отражать только Индию, есликод запускается на компьютере с часовым поясом Индии.Если он запущен на компьютере с другим часовым поясом, он будет отражать этот часовой пояс.Имейте в виду, что внутри объекта Date
отслеживается только временная метка на основе UTC.Местный часовой пояс применяется при вызове функций и свойств, для которых требуется местное время, а не при создании объекта Date
.
добавление значения смещения часового пояса
let uts_ms = india_date.getTime() + india_date.getTimezoneOffset()
Этот подход неверен.getTime()
уже возвращает временную метку на основе UTC.Вам не нужно добавлять ваше локальное смещение.(также сокращение UTC, а не UTS.)
Теперь добавьте значение смещения часового пояса Калифорнии
let california_ms = utc_ms + getCaliforniaTimezoneOffsetMS()
Опять добавление смещения некорректно.Кроме того, в отличие от Индии, в Калифорнии наблюдается переход на летнее время, поэтому часть года смещение будет 480
(UTC-8), а часть года смещение будет 420
(UTC-7).Любая функция, такая как getCaliforniatimezoneOffsetMS
, должна иметь метку времени, передаваемую в качестве параметра, чтобы она действовала.
и, наконец, объект даты
let california_date: Date = new Date(california_ms)
Когдаконструктору Date
передается числовая метка времени, она должна быть в формате UTC.Передавая эту california_ms
метку времени, вы просто выбираете другой момент времени.Вы не можете изменить поведение Date
объекта, чтобы заставить его использовать другой часовой пояс, просто добавляя или вычитая смещение.Он по-прежнему будет использовать местный часовой пояс, в котором он выполняется, для любой функции, для которой требуется местное время, например .toString()
и др.
Существует только один сценарий, в котором имеет смысл подобная настройка, котораяэто техника, известная как «смена эпох».Временная метка регулируется для смещения базовой эпохи от обычного 1970-01-01T00:00:00Z
, что позволяет использовать преимущества UTC-функций Date
объекта (таких как getUTCHours
и другие).Подвох заключается в том, что после сдвига вы не сможете использовать какие-либо функции локального времени для этого объекта Date
или передавать его чему-либо еще, что ожидает, что объект Date
будет нормальным.Сдвиг эпохи, сделанный правильно - это то, что делает библиотеки такими, как Moment.js . Здесь - еще один пример правильной смены эпох.
Но в вашем примере вы смещаетесь (дважды по ошибке), а затем используете объект Date
, как если бы он был нормальным и не смещался.Это может привести только к ошибкам, очевидным для часового пояса, показанного в выводе toString
, и будет возникать математически вблизи любых DST-переходов местного часового пояса и предполагаемого целевого часового пояса.В общем, вы не хотите использовать этот подход.
Вместо этого прочитайте мой ответ на Как инициализировать дату JavaScript для определенного часового пояса. Здесь перечислены ваши варианты.Спасибо.