С# британское летнее время (BST) сокращение от часовой пояс

Мне нужно отобразить метку с аббревиатурой текущего часового пояса. Мой часовой пояс в настоящее время установлен на "(GMT)" Среднее время по Гринвичу: Дублин, Эдинбург, Лиссабон, Лондон ". В результате я хотел бы увидеть BST, поскольку LN в настоящее время находится в британском летнем времени.

Похоже, эта информация (аббревиатура часового пояса) недоступна. Глядя на GMT TimeZoneInfo, все, что я вижу в отношении имен,

Id  "GMT Standard Time"
StandardName    "GMT Standard Time"
DaylightName    "GMT Daylight Time"

Есть ли способ добраться до BST с "GMT Daylight Time" или любой другой доступной информации о часовом поясе Windows?

Ответы

Ответ 1

Ссылки на TimeZoneInfo ссылаются на "Британское летнее время" как "GMT Daylight Time", поэтому нет, это невозможно. Если Microsoft будет хранить его как "BST", он будет находиться в свойстве DaylightName.

Во время разработки класса TimeZoneInfo в блоге BCL много лет назад я не видел объяснений, как они выбрали значения для DaylightName. Если бы я догадался, что это будет потому, что это для "часовой пояс", а не для определенного города.

Похоже, что публичная область tzdatabase, которая считается более полной, чем база данных часовых поясов Microsoft, отображает BST для Лондона (источник). Это связано с тем, что города включены в этот набор данных, а не только во временные зоны. Существует проект под названием Noda Time, который приводит tzdatabase к .Net, который теперь доступен.

Ответ 2

Я думаю, у вас есть два варианта: обработка особых случаев для часовой пояс GMT или обобщенная обработка для "часовых поясов, для которых Microsoft использует неправильное имя".

Интересно, например, что португальцы используют "GMT" для своего часового пояса зимой. Независимо от того, делают они это или нет, я сомневаюсь, что они используют "британское летнее время" летом!

Ответ 3

Вы должны знать, что все часовые пояса, которые говорят "Стандарт", будут правильно переключаться на летнее время летом. Например, TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time") будет объектом, который может правильно обрабатывать как стандартные, так и дневные. То же самое верно, например, "Pacific Standard Time".