Конвертировать UTC DateTime в другой часовой пояс - PullRequest
31 голосов
/ 30 марта 2010

У меня есть значение UTC DateTime из записи базы данных. У меня также есть указанный пользователем часовой пояс (экземпляр TimeZoneInfo). Как мне преобразовать этот UTC DateTime в местный часовой пояс пользователя? Кроме того, как я могу определить, наблюдает ли пользовательский часовой пояс в настоящее время летнее время? Я использую .NET 3.5.

Спасибо, Mark

Ответы [ 5 ]

33 голосов
/ 05 июня 2014

Лучший способ сделать это - просто использовать TimeZoneInfo.ConvertTimeFromUtc.

// you said you had these already
DateTime utc = new DateTime(2014, 6, 4, 12, 34, 0);
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

// it's a simple one-liner
DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, tzi);

Единственный улов в том, что входящее значение DateTime может не иметь вида DateTimeKind.Local. Это должно быть либо Utc, либо Unspecified.

20 голосов
/ 04 сентября 2012

Вы можете использовать выделенную функцию в TimeZoneInfo, если хотите преобразовать DateTimeOffset в другой DateTimeOffset:

DateTimeOffset newTime = TimeZoneInfo.ConvertTime(
    DateTimeOffset.UtcNow, 
    TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
);
18 голосов
/ 30 марта 2010

Посмотрите на структуру DateTimeOffset :

// user-specified time zone
TimeZoneInfo southPole =
    TimeZoneInfo.FindSystemTimeZoneById("Antarctica/South Pole Standard Time");

// an UTC DateTime
DateTime utcTime = new DateTime(2007, 07, 12, 06, 32, 00, DateTimeKind.Utc);

// DateTime with offset
DateTimeOffset dateAndOffset =
    new DateTimeOffset(utcTime, southPole.GetUtcOffset(utcTime));

Console.WriteLine(dateAndOffset);

Для перехода на летнее время см. Метод TimeZoneInfo.IsDaylightSavingTime .

bool isDst = southpole.IsDaylightSavingTime(DateTime.UtcNow);
12 голосов
/ 02 сентября 2012

Ответ Antartica работает только для часовых поясов, соответствующих UTC. Я очень травмирован этой функцией DateTimeOffset, и после нескольких часов проб и ошибок мне удалось создать практическую функцию расширения преобразования, которая работает со всеми часовыми поясами.

static public class DateTimeFunctions
{
    static public DateTimeOffset ConvertUtcTimeToTimeZone(this DateTime dateTime, string toTimeZoneDesc)
    {
        if (dateTime.Kind != DateTimeKind.Utc) throw new Exception("dateTime needs to have Kind property set to Utc");
        var toUtcOffset = TimeZoneInfo.FindSystemTimeZoneById(toTimeZoneDesc).GetUtcOffset(dateTime);
        var convertedTime = DateTime.SpecifyKind(dateTime.Add(toUtcOffset), DateTimeKind.Unspecified);
        return new DateTimeOffset(convertedTime, toUtcOffset);
    }
}

Пример:

var currentTimeInPacificTime = DateTime.UtcNow.ConvertUtcTimeToTimeZone("Pacific Standard Time");
0 голосов
/ 10 марта 2016
       //  TO get Currrent Time in current Time Zone of your System

        var dt = DateTime.Now;

        Console.WriteLine(dt);

        // Display Time Zone of your System

        Console.WriteLine(TimeZoneInfo.Local);

        // Convert Current Date Time to UTC Date Time

        var utc = TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local);

        Console.WriteLine(utc);

        // Convert UTC Time to Current Time Zone

        DateTime pacific = TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.Local);

        Console.WriteLine(pacific);

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