Текущее время часового пояса - PullRequest
6 голосов
/ 14 июля 2010

У меня есть разные часовые пояса и их GMT и DST. Пример:

TimeZoneId        |   GMT offset  |   DST offset  
                  |  1. Jan 2010  |  1. Jul 2010
--------------------------------------------------
America/Adak      |    -10.0      |     -9.0
America/Anchorage |     -9.0      |     -8.0
America/Anguilla  |     -4.0      |     -4.0
America/Antigua   |     -4.0      |     -4.0
America/Araguaina |     -3.0      |     -3.0

Эти часовые пояса предоставляются Geoname.

Как рассчитать текущее время для любого часового пояса, известного по Гринвичу и летнему времени в C # /. NET?

Обновление: для уточнения, я предоставляю "Америка / Антигуа", и мне нужно текущее время в "Америка / Антигуа".

Ответы [ 3 ]

6 голосов
/ 14 июля 2010
TimeZoneInfo.ConvertTimeFromUtc(mytime, TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"));
2 голосов
/ 14 июля 2017

Идентификаторы часовых поясов, которые вы указали, взяты из базы данных часовых поясов IANA, она же TZDB (она же Olson, она же tz).Они не поддерживаются .NET (хотя .NET Core, работающий на Linux / Mac, вероятно, сделает то, что вы хотите).

My Noda Time проект поддерживает их хотя.Вы бы использовали:

var zoneId = "America/Antigua";
var zone = DateTimeZoneProviders.Tzdb[zoneId];
var now = SystemClock.Instance.GetCurrentInstant();
var zoned = now.InZone(zone);
Console.WriteLine(zoned);

Это явно использует SystemClock - в реальном коде я бы посоветовал вам принять IClock через внедрение зависимостей для тестируемости - внедрить SystemClock.Instance при запуске приложения, но используйте FakeClock для тестирования.

Альтернативный эквивалентный код, демонстрирующий ZonedClock:

var zoneId = "America/Antigua";
var zone = DateTimeZoneProviders.Tzdb[zoneId];
var systemClock = SystemClock.Instance;
var zonedClock = systemClock.InZone(zone);
var zoned = zonedClock.GetCurrentZonedDateTime();
Console.WriteLine(zoned);
0 голосов
/ 14 июля 2010
private static ReadOnlyCollection<TimeZoneInfo> _timeZones = TimeZoneInfo.GetSystemTimeZones();

public static DateTime ToUsersTime(this DateTime utcDate, int timeZoneId)
{
    return TimeZoneInfo.ConvertTimeFromUtc(utcDate, timeZones[timeZoneId]);
}

Пример преобразования даты UTC в дату пользователя с использованием класса TimeZoneInfo (.NET 3.5 +).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...