Как все остальные упомянули.NET 2 не содержит информации о часовом поясе. Информация хранится в реестре, тем не менее, и его довольно тривиальном для записи класса обертки вокруг этого:
SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones
содержит подключи навсегда зоны. Значение поля TZI содержит весь переход и свойства предвзятости какое-то время зона, но это все наполнено в двоичном массиве. Самые важные биты (предвзятость и дневной свет), int32s, сохраненный в положениях 0 и 8 соответственно:
int bias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 0);
int daylightBias = BitConverter.ToInt32((byte[])tzKey.GetValue("TZI"), 8);
Вот архив , Как получить информацию о часовом поясе (DST) из реестра?
В.NET 3.5, существует TimeZoneInfo
, который обеспечивает большую функциональность в этой области; 2.0SP1 имеет DateTimeOffset
, но это намного более ограничено.
Получение UtcNow
и добавление фиксированного смещения является частью задания, но не осведомлено о DST.
Так в 3,5 я думаю, что можно сделать что-то как:
DateTime eastern = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
DateTime.UtcNow, "Eastern Standard Time");
, Но это просто не существует в 2,0; извините.
Я сэкономлю Вам время и скажу Вам, что нет никакого пути в надлежащем .net, версия 2.0 для получения объекта DateTime для другого часового пояса, отличающегося от того, на котором программное обеспечение работает (кроме UTC).
Однако, который не означает, нет способа сделать это за пределами .net. Смотрите здесь в классе TimeZoneInformation. Этот класс обертывает некоторый материал p/invoke к Победе O/S для получения информации часового пояса от O/S. Я успешно использовал его назад, когда 2.0 было новым, и это работало очень хорошо. Сайт я продолжал работать, должен был быть в состоянии показать каждую дату/время, локальную для пользователя, и должен был быть осведомлен о DST, и этот класс подошел для нас.
Как насчет
DateTime lclTime = DateTime.Now;
DateTime ept = lclTime.ToUniversalTime().AddHours(
IsEasternDaylightSavingTime(
lclTime.ToUniversalTime())? -5: -4)
или если Вы уже имеете локальный UTC, всего
DateTime lclUtc = DateTime.UtcNow;
DateTime ept = lclUtc.AddHours(
IsEasternDaylightSavingTime(lclUtc)? -5: -4)
Использование статический словарь твердых кодированных значений для Spring вперед и отступаете даты в течение Восточного времени в течение следующих 50 лет.. Это составляет приблизительно только 300 байтов..., и затем индексируйте в это, чтобы определить, является ли это Летним временем на восточном побережье... Как указано, Вы надеваете; t заботятся, является ли это DST в локальной зоне или нет...
private static bool IsEasternDaylightSavingTime(DateTime utcDateTime)
{
// hard coded method to determine
// whether utc datetime is Eastern Standard time
// or Eastern Daylight Time
}
От - http://msdn.microsoft.com/en-us/library/system.timezoneinfo.converttimefromutc.aspx
Это позволяет часовому поясу быть найденным по имени, в случае, если США когда-либо пускают в ход 15 градусов на запад или восток от лондонского меридиана.
DateTime timeUtc = DateTime.UtcNow;
try
{
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
Console.WriteLine("The date and time are {0} {1}.",
cstTime,
cstZone.IsDaylightSavingTime(cstTime) ?
cstZone.DaylightName : cstZone.StandardName);
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine("The registry does not define the Central Standard Time zone.");
}
catch (InvalidTimeZoneException)
{
Console.WriteLine("Registry data on the Central STandard Time zone has been corrupted.");
}