Отображение часовых поясов в WPF / C #. Узнать о смещении летнего времени - PullRequest
2 голосов
/ 22 октября 2008

У меня проблемы с пониманием того, как системный реестр может помочь мне преобразовать объект DateTime в соответствующую временную зону. У меня есть пример, который я пытался перепроектировать, но я просто не могу выполнить один важный шаг, в котором время UTC смещается в зависимости от летнего времени.

Я использую .NET 3.5 (слава богу), но это все еще сбивает меня с толку.

Спасибо

РЕДАКТИРОВАТЬ: Дополнительная информация: Этот вопрос был для использования в среде приложений WPF. Фрагмент кода, который я оставил ниже, продвинул пример ответа на шаг вперед, чтобы получить именно то, что я искал.

Ответы [ 3 ]

9 голосов
/ 22 октября 2008

Вот фрагмент кода в 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);

Это фрагмент кода, с которым я закончил. Спасибо за помощь.

3 голосов
/ 22 октября 2008

Вы можете использовать DateTimeOffset, чтобы получить смещение UTC, поэтому вам не нужно копаться в реестре для этой информации.

TimeZone.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();

Этот код создает DateTime со смещением -8. Установленные часовые пояса по умолчанию перечислены в MSDN .

0 голосов
/ 11 марта 2011
//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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...