Pergunta

Estou tendo dificuldade para entender como o registro do sistema pode me ajudar a converter um objeto DateTime para a um fuso horário correspondente. Eu tenho um exemplo que eu tenho tentado fazer engenharia reversa, mas eu simplesmente não posso seguir a um passo crítico no qual o UTCTime é compensado dependendo Horário de Verão.

Eu estou usando .NET 3.5 (graças a Deus), mas ainda está me confundindo.

Graças

EDIT: Informações adicionais: Esta pergunta foi para uso em um ambiente de aplicação WPF. O trecho de código que deixei abaixo tomou o exemplo resposta mais um passo para obter exatamente o que eu estava procurando.

Foi útil?

Solução

Aqui está um trecho de código em C # que eu estou usando no meu aplicativo WPF. Isto lhe dará a hora atual (ajustado para o horário de verão) para o ID de fuso horário que você fornecer.

// _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);

Este é o código snippit acabei com. Obrigado pela ajuda.

Outras dicas

Você pode usar DateTimeOffset para obter o deslocamento UTC para que você não precisa cavar o registro para essa informação.

TimeZone.CurrentTimeZone retorna dados de fuso horário adicionais e TimeZoneInfo.Local tem meta dados sobre o fuso horário (como se ele suporta o horário de verão, os nomes de seus vários estados, etc).

Update: Eu acho que isso responde especificamente a sua pergunta:

var tzi = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var dto = new DateTimeOffset(2008, 10, 22, 13, 6, 0, tzi.BaseUtcOffset);
Console.WriteLine(dto);
Console.ReadLine();

Esse código cria um DateTime a -8 offset. Os fusos horários padrão instalado são listado no 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top