Отображение часовых поясов в WPF / C #.Откройте для себя Смещение летнего времени
Вопрос
У меня возникли проблемы с пониманием того, как Системный реестр может помочь мне преобразовать объект DateTime в соответствующий часовой пояс.У меня есть пример, который я пытался перепроектировать, но я просто не могу выполнить один важный шаг, на котором время UTC смещается в зависимости от перехода на летнее время.
Я использую .NET 3.5 (слава богу), но это все еще ставит меня в тупик.
Спасибо
Редактировать:Дополнительная информация:Этот вопрос был предназначен для использования в среде приложений WPF.Фрагмент кода, который я оставил ниже, продвинул пример ответа на шаг вперед, чтобы получить именно то, что я искал.
Решение
Вот фрагмент кода на C #, который я использую в своем приложении WPF.Это даст вам текущее время (с поправкой на летнее время) для указанного вами идентификатора часового пояса.
// _timeZoneId is the String value found in the System Registry.
// You can look up the list of TimeZones on your system using this:
// ReadOnlyCollection<TimeZoneInfo> current = TimeZoneInfo.GetSystemTimeZones();
// As long as your _timeZoneId string is in the registry
// the _now DateTime object will contain
// the current time (adjusted for Daylight Savings Time) for that Time Zone.
string _timeZoneId = "Pacific Standard Time";
DateTime startTime = DateTime.UtcNow;
TimeZoneInfo tst = TimeZoneInfo.FindSystemTimeZoneById(_timeZoneId);
_now = TimeZoneInfo.ConvertTime(startTime, TimeZoneInfo.Utc, tst);
Это фрагмент кода, с которым я в итоге столкнулся.Спасибо за помощь.
Другие советы
Вы можете использовать DateTimeOffset для получения смещения UTC, поэтому вам не нужно копаться в реестре для получения этой информации.
Часовой пояс.CurrentTimeZone возвращает дополнительные данные о часовом поясе, а TimeZoneInfo.Local содержит метаданные о часовом поясе (например, поддерживает ли он переход на летнее время, названия его различных состояний и т.д.).
Обновить:Я думаю, что это конкретно отвечает на ваш вопрос:
var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var dto = new DateTimeOffset(2008, 10, 22, 13, 6, 0, tzi.BaseUtcOffset);
Console.WriteLine(dto);
Console.ReadLine();
Этот код создает дату-время со смещением -8.По умолчанию установлены следующие часовые пояса указан в MSDN.
//C#.NET
public static bool IsDaylightSavingTime()
{
return IsDaylightSavingTime(DateTime.Now);
}
public static bool IsDaylightSavingTime(DateTime timeToCheck)
{
bool isDST = false;
System.Globalization.DaylightTime changes
= TimeZone.CurrentTimeZone.GetDaylightChanges(timeToCheck.Year);
if (timeToCheck >= changes.Start && timeToCheck <= changes.End)
{
isDST = true;
}
return isDST;
}
'' VB.NET
Const noDate As Date = #1/1/1950#
Public Shared Function IsDaylightSavingTime( _
Optional ByVal timeToCheck As Date = noDate) As Boolean
Dim isDST As Boolean = False
If timeToCheck = noDate Then timeToCheck = Date.Now
Dim changes As DaylightTime = TimeZone.CurrentTimeZone _
.GetDaylightChanges(timeToCheck.Year)
If timeToCheck >= changes.Start And timeToCheck <= changes.End Then
isDST = True
End If
Return isDST
End Function