Chrono Mock
ЯзыкРусский

Запустите приложение в другом часовом поясе

Отчёт, который попадает не в тот день, напоминание, которое срабатывает на час раньше, метка времени, читающаяся как «завтра» — большая часть этого проявляется только в поясе, в котором вы не находитесь. Эта программа даёт одному процессу собственное смещение, а ваш системный пояс остаётся ровно там, где был.

Почему обычные ответы не помогают

  • Смена часового пояса Windows меняет его для всего — календаря, логов, встреч — а на управляемой машине менять его, возможно, не вам.
  • Установка TZ работает для одних сред выполнения и не работает для других. Нативное приложение Windows, читающее GetTimeZoneInformation, её вообще не заметит.
  • Инструменты разработчика в браузере переопределяют пояс для веб-страницы, что превосходно и не имеет отношения к настольному приложению.

Один процесс — одно смещение

Сессия несёт собственное смещение. Приложение спрашивает у Windows, в каком оно поясе, и получает именно этот ответ, а любая другая программа на машине получает настоящий.

# Тот же момент, каким его видят с западного побережья Америки
chrono run "C:\apps\test.exe" --at 2027-01-15T09:00:00 --zone -08:00

# Только пояс — сегодняшняя настоящая дата, чужие часы
chrono run "C:\apps\test.exe" --zone +09:00

Калькулятор отвечает на вторую половину вопроса — как данный момент на самом деле читается в другом месте. Преобразование сохраняет момент и меняет лишь настенные часы, и именно так дата попадает не в тот день:

$ chrono calc --base 2027-01-15T09:00:00 --zone +01:00 --to-zone -08:00
Chrono Mock - date calculator
  base:    2027-01-15T09:00:00
  step 1:  zone -08:00  -> 2027-01-15T00:00:00
  result:  2027-01-15T00:00:00
  formats:
    ISO date      2027-01-15
    ISO datetime  2027-01-15T00:00:00-08:00
    US            01/15/2027
    PL            15.01.2027

Девять утра в Центральной Европе — это полночь на западном побережье Америки. Один и тот же момент, а суточный отчёт, группирующий по местной дате, отнесёт его к разным дням в зависимости от того, где он запущен.

Честные ограничения, и здесь они важны

Пояс сессии — это фиксированное смещение без летнего времени.

Сессия, настроенная на +01:00, остаётся на +01:00, показывают её часы январь или июль. Поэтому запуск, пересекающий настоящий переход, расходится на час с тем, что этот пояс действительно показал бы, а проведение приложения через переход на летнее время этот инструмент пока не делает. Калькулятор дат говорит об этом, а не гадает.

  • Пояс называет себя «Chrono Session» — именем, которого не знает ни один реестр Windows. Всё, что сопоставляет это имя обратно с поясом, — в том числе TimeZoneInfo.Local в .NET, — возвращается вместо этого к смещению, что и является правильным ответом. Приложение, настаивающее на имени из реестра, его не найдёт.
  • Java принимает пояс сессии как смещение. У пояса сессии нет летнего времени и нет города за ним, поэтому Java называет его по смещению — GMT+05:30 для сессии на +05:30.
  • В режиме Chromium и Electron страницы тоже читают пояс сессии. Это то же фиксированное смещение: каждая страница и каждый воркер переводится на него и проверяет то, что читает. Главный процесс приложения Electron выполняет JavaScript в Node, куда сессия не доходит, поэтому он остаётся на реальных часах.
  • Смещения идут от -14:00 до +14:00 в целых минутах. Всё за этими пределами отклоняется, а не тихо заворачивается.

Что из этого относится к вашему приложению, можно измерить, а не угадывать. Сессия сообщает о собственном покрытии →

Попробуйте