Разбор часового пояса NodaTime: смещение Etc/GMT+3 отрицательное

Это небольшой пример кода, иллюстрирующий проблему:

enter code here
var offset1 = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Europe/Moscow")
            .GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow));
var offset2 = DateTimeZoneProviders.Tzdb.GetZoneOrNull("Etc/GMT+3")
            .GetUtcOffset(Instant.FromDateTimeUtc(DateTime.UtcNow));

Console.WriteLine(offset1 + " vs " + offset2);

Результаты в "{+03} против {-03}"


person Igor Be    schedule 06.12.2017    source источник


Ответы (1)


Да, это правильно. Это связано с тем, что идентификаторы зон «Etc/GMT+X» сбивают с толку. Они соответствуют строкам POSIX TZ, которые по какой-то причине представляют «смещение UTC от местного времени» вместо обычного «смещения местного времени от UTC». См. список часовых поясов базы данных tz в Википедии для подтверждения этого.

Из файла etcetra:

# Be consistent with POSIX TZ settings in the Zone names,
# even though this is the opposite of what many people expect.
# POSIX has positive signs west of Greenwich, but many people expect
# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
# the abbreviation "-04" and corresponds to 4 hours behind UT
# (i.e. west of Greenwich) even though many people would expect it to
# mean 4 hours ahead of UT (i.e. east of Greenwich).

Если вы хотите создать часовой пояс, представляющий фиксированное смещение, вы можете использовать идентификатор «UTC+X» или использовать DateTimeZone.ForOffset.

person Jon Skeet    schedule 07.12.2017