Запустите приложение в другом часовом поясе
Отчёт, который попадает не в тот день, напоминание, которое срабатывает на час раньше, метка времени, читающаяся как «завтра» — большая часть этого проявляется только в поясе, в котором вы не находитесь. Эта программа даёт одному процессу собственное смещение, а ваш системный пояс остаётся ровно там, где был.
Почему обычные ответы не помогают
- Смена часового пояса 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 в целых минутах. Всё за этими пределами отклоняется, а не тихо заворачивается.
Что из этого относится к вашему приложению, можно измерить, а не угадывать. Сессия сообщает о собственном покрытии →