.NET: учет летнего времени - PullRequest
4 голосов
/ 28 апреля 2011

У меня есть метод, который создает UTC DateTime из пользовательского ввода, используя смещение GMT ​​их географического положения:

public static DateTime LocalToUtc
    (int year, int month, int day, int hour, decimal gmtOffset) {

    // argument validation here

    var dateTime = new DateTime(year, month, day).AddHours(hour);
    var dateTimeOffset = 
        new DateTimeOffset(dateTime, TimeSpan.FromHours(gmtOffset));

    return dateTimeOffset.UtcDateTime;

} 

Проблема в том, что эта функция отключена на час, если это дневной светэкономия в часовом поясе пользователя.

Таким образом, хотя мое личное смещение по Гринвичу равно -8, текущее смещение часового пояса равно -7 из-за перехода на летнее время.

Как изменить указанную выше функцию для учетадневного сбережения?Разве мне не нужно как-то создавать объект часового пояса из смещения по Гринвичу и получать его смещение по часовому поясу?

Ответы [ 4 ]

2 голосов
/ 28 апреля 2011

Невозможно сделать это, не зная фактического часового пояса: несколько часовых поясов имеют одинаковое базовое смещение UTC, но с разными правилами перехода на летнее время. Например, W. Стандартное европейское время и Вт. Стандартное время Центральной Африки имеет смещение +01: 00, но первое поддерживает DST, а второе - нет. Таким образом, смещения недостаточно, чтобы решить, применяется ли DST или нет ...

Ваш метод должен принимать параметр TimeZoneInfo вместо gmtOffset. Таким образом, вы можете просто использовать метод TimeZoneInfo.ConvertTime для преобразования даты, он будет автоматически учитывать DST.

1 голос
/ 28 апреля 2011

DateTime уже имеет методы для этого, называемые ToLocalTime() и ToUniversalTime().Что не так с этим?

РЕДАКТИРОВАТЬ:

Исходя из комментария, что автор хочет конвертировать в utc из часового пояса, отличного от текущего часового пояса компьютеров, я отсылаю вас к Джону Скитсуответ Здесь

Из документации MSDN :

string displayName = "(GMT+06:00) Antarctica/Mawson Time";
string standardName = "Mawson Time"; 
TimeSpan offset = new TimeSpan(06, 00, 00);
TimeZoneInfo mawson = TimeZoneInfo.CreateCustomTimeZone(standardName, 
    offset, displayName, standardName);
Console.WriteLine("The current time is {0} {1}", 
                  TimeZoneInfo.ConvertTime(DateTime.Now, 
                       TimeZoneInfo.Local, mawson), mawson.StandardName);      
0 голосов
/ 28 апреля 2011

Поскольку звучит так, что вы спрашиваете пользователей о смещении времени, которое не обязательно должно быть в местном часовом поясе машины, время локальной машины не будет работать.Но используя класс TimeZoneInfo , вы сможете создать экземпляр, который учитывает смещение и состояние летнего времени, и использовать встроенные методы оттуда.

Редактировать: На моем компьютере, по крайней мере, TimeZoneInfo.GetSystemTimeZones(), похоже, возвращает все действительные часовые пояса.Это можно легко сопоставить с раскрывающимся меню, чтобы пользователь мог выбрать.

0 голосов
/ 28 апреля 2011

Вам следует использовать метод TimeZone.GetUtcOffset, если вы не хотите использовать встроенный метод UTC.

http://msdn.microsoft.com/en-us/library/system.timezone.getutcoffset.aspx

Это даст вам смещение к UTC.Вы также можете использовать встроенные методы для получения времени UTC по местному времени.

http://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime(v=VS.100).aspx

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