Partilhar via


Convertendo entre DateTime e DateTimeOffset

Embora a estrutura DateTimeOffset proporcione um grau maior de consciência do fuso horário do que a estrutura DateTime, os parâmetros DateTime são usados mais frequentemente nas chamadas de métodos. Por causa desta abordagem, a capacidade de converter DateTimeOffset valores em DateTime valores e vice-versa é importante. Este artigo mostra como executar essas conversões de forma a preservar o máximo possível de informações de fuso horário.

Observação

Tanto os DateTime tipos como os DateTimeOffset têm algumas limitações ao representar horários em fusos horários. Com a sua Kind propriedade, DateTime consegue refletir apenas o Tempo Universal Coordenado (UTC) e o fuso horário local do sistema. DateTimeOffset reflete o deslocamento temporal em relação ao UTC, mas não reflete o fuso horário real ao qual esse deslocamento pertence. Para mais informações sobre valores de tempo e suporte para fusos horários, consulte Escolher entre DateTime, DateTimeOffset, TimeSpan e TimeZoneInfo.

Conversões de DateTime para DateTimeOffset

A DateTimeOffset estrutura fornece duas formas equivalentes de realizar DateTime a DateTimeOffset conversão que são adequadas para a maioria das conversões:

Para valores UTC e locais DateTime, a propriedade Offset do valor resultante DateTimeOffset reflete com precisão o deslocamento em relação ao UTC ou ao fuso horário local. Por exemplo, o seguinte código converte um tempo UTC para o seu valor equivalente DateTimeOffset :

DateTime utcTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
utcTime1 = DateTime.SpecifyKind(utcTime1, DateTimeKind.Utc);
DateTimeOffset utcTime2 = utcTime1;
Console.WriteLine($"Converted {utcTime1} {utcTime1.Kind} to a DateTimeOffset value of {utcTime2}");
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Utc to a DateTimeOffset value of 6/19/2008 7:00:00 AM +00:00
Dim utcTime1 As Date = Date.SpecifyKind(#06/19/2008 7:00AM#, _
                                        DateTimeKind.Utc)
Dim utcTime2 As DateTimeOffset = utcTime1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  utcTime1, _
                  utcTime1.Kind.ToString(), _
                  utcTime2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Utc to a DateTimeOffset value of 6/19/2008 7:00:00 AM +00:00                        

Neste caso, o deslocamento da utcTime2 variável é 00:00. De forma semelhante, o código seguinte converte um tempo local para o seu valor equivalente DateTimeOffset . A conversão realiza-se no fuso horário padrão do Pacífico dos EUA:

DateTime localTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
localTime1 = DateTime.SpecifyKind(localTime1, DateTimeKind.Local);
DateTimeOffset localTime2 = localTime1;
Console.WriteLine($"Converted {localTime1} {localTime1.Kind} to a DateTimeOffset value of {localTime2}");
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Local to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00
Dim localTime1 As Date = Date.SpecifyKind(#06/19/2008 7:00AM#, DateTimeKind.Local)
Dim localTime2 As DateTimeOffset = localTime1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  localTime1, _
                  localTime1.Kind.ToString(), _
                  localTime2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Local to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00

No entanto, para DateTime valores cuja Kind propriedade é DateTimeKind.Unspecified, estes dois métodos de conversão produzem um DateTimeOffset valor cujo deslocamento é o do fuso horário local. A conversão é mostrada no exemplo a seguir, que é executado no fuso horário padrão do Pacífico dos EUA:

DateTime time1 = new DateTime(2008, 6, 19, 7, 0, 0);  // Kind is DateTimeKind.Unspecified
DateTimeOffset time2 = time1;
Console.WriteLine($"Converted {time1} {time1.Kind} to a DateTimeOffset value of {time2}");
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00
Dim time1 As Date = #06/19/2008 7:00AM#      ' Kind is DateTimeKind.Unspecified
Dim time2 As DateTimeOffset = time1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  time1, _
                  time1.Kind.ToString(), _
                  time2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00

Se o valor DateTime refletir a data e a hora em algo diferente do fuso horário local ou do UTC, pode convertê-lo em um valor DateTimeOffset e preservar a informação do fuso horário utilizando o construtor sobrecarregado DateTimeOffset. Por exemplo, o seguinte exemplo instancia um DateTimeOffset objeto que reflete a Hora Padrão Central:

DateTime time1 = new DateTime(2008, 6, 19, 7, 0, 0);     // Kind is DateTimeKind.Unspecified
try
{
   DateTimeOffset time2 = new DateTimeOffset(time1,
                  TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(time1));
   Console.WriteLine($"Converted {time1} {time1.Kind} to a DateTime value of {time2}");
}
// Handle exception if time zone is not defined in registry
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("Unable to identify target time zone for conversion.");
}
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTime value of 6/19/2008 7:00:00 AM -05:00
Dim time1 As Date = #06/19/2008 7:00AM#      ' Kind is DateTimeKind.Unspecified
Try
    Dim time2 As New DateTimeOffset(time1, _
                     TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(time1))
    Console.WriteLine("Converted {0} {1} to a DateTime value of {2}", _
                      time1, _
                      time1.Kind.ToString(), _
                      time2)
    ' Handle exception if time zone is not defined in registry
Catch e As TimeZoneNotFoundException
    Console.WriteLine("Unable to identify target time zone for conversion.")
End Try
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTime value of 6/19/2008 7:00:00 AM -05:00

O segundo parâmetro desta sobrecarga de construtores é um TimeSpan objeto que representa o deslocamento temporal em relação ao UTC. Recupere-o chamando o método TimeZoneInfo.GetUtcOffset(DateTime) do fuso horário correspondente. O único parâmetro do método é o DateTime valor que representa a data e hora a converter. Se o fuso horário oferecer suporte ao horário de verão, esse parâmetro permitirá que o método determine o deslocamento apropriado para essa data e hora específicas.

Conversões de DateTimeOffset para DateTime

A DateTime propriedade é mais frequentemente usada para realizar DateTimeOffset a DateTime conversão. No entanto, devolve um DateTime valor cuja Kind propriedade é Unspecified, como ilustra o exemplo seguinte:

DateTime baseTime = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset sourceTime;
DateTime targetTime;

// Convert UTC to DateTime value
sourceTime = new DateTimeOffset(baseTime, TimeSpan.Zero);
targetTime = sourceTime.DateTime;
Console.WriteLine($"{sourceTime} converts to {targetTime} {targetTime.Kind}");

// Convert local time to DateTime value
sourceTime = new DateTimeOffset(baseTime,
                                TimeZoneInfo.Local.GetUtcOffset(baseTime));
targetTime = sourceTime.DateTime;
Console.WriteLine($"{sourceTime} converts to {targetTime} {targetTime.Kind}");

// Convert Central Standard Time to a DateTime value
try
{
   TimeSpan offset = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(baseTime);
   sourceTime = new DateTimeOffset(baseTime, offset);
   targetTime = sourceTime.DateTime;
   Console.WriteLine($"{sourceTime} converts to {targetTime} {targetTime.Kind}");
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("Unable to create DateTimeOffset based on U.S. Central Standard Time.");
}
// This example displays the following output to the console:
//    6/19/2008 7:00:00 AM +00:00 converts to 6/19/2008 7:00:00 AM Unspecified
//    6/19/2008 7:00:00 AM -07:00 converts to 6/19/2008 7:00:00 AM Unspecified
//    6/19/2008 7:00:00 AM -05:00 converts to 6/19/2008 7:00:00 AM Unspecified
Const baseTime As Date = #06/19/2008 7:00AM#
Dim sourceTime As DateTimeOffset
Dim targetTime As Date

' Convert UTC to DateTime value
sourceTime = New DateTimeOffset(baseTime, TimeSpan.Zero)
targetTime = sourceTime.DateTime
Console.WriteLine("{0} converts to {1} {2}", _
                  sourceTime, _
                  targetTime, _
                  targetTime.Kind.ToString())

' Convert local time to DateTime value
sourceTime = New DateTimeOffset(baseTime, _
                                TimeZoneInfo.Local.GetUtcOffset(baseTime))
targetTime = sourceTime.DateTime
Console.WriteLine("{0} converts to {1} {2}", _
                  sourceTime, _
                  targetTime, _
                  targetTime.Kind.ToString())

' Convert Central Standard Time to a DateTime value
Try
    Dim offset As TimeSpan = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(baseTime)
    sourceTime = New DateTimeOffset(baseTime, offset)
    targetTime = sourceTime.DateTime
    Console.WriteLine("{0} converts to {1} {2}", _
                      sourceTime, _
                      targetTime, _
                      targetTime.Kind.ToString())
Catch e As TimeZoneNotFoundException
    Console.WriteLine("Unable to create DateTimeOffset based on U.S. Central Standard Time.")
End Try
' This example displays the following output to the console:
'    6/19/2008 7:00:00 AM +00:00 converts to 6/19/2008 7:00:00 AM Unspecified
'    6/19/2008 7:00:00 AM -07:00 converts to 6/19/2008 7:00:00 AM Unspecified
'    6/19/2008 7:00:00 AM -05:00 converts to 6/19/2008 7:00:00 AM Unspecified                       

O exemplo anterior mostra que qualquer informação sobre a DateTimeOffset relação do valor com o UTC é perdida pela conversão quando a DateTime propriedade é utilizada. Este comportamento também afeta os valores de DateTimeOffset que correspondem à hora UTC ou à hora local do sistema, pois a estrutura de DateTime reflete apenas esses dois fusos horários na propriedade de Kind.

Para preservar o máximo possível de informação sobre fusos horários ao converter um valor DateTimeOffset para DateTime, pode usar as propriedades DateTimeOffset.UtcDateTime e DateTimeOffset.LocalDateTime.

Convertendo um horário UTC

Para indicar que um valor convertido DateTime é a hora UTC, pode recuperar o valor da DateTimeOffset.UtcDateTime propriedade. Diverge da propriedade DateTime em dois aspetos:

Observação

Se a sua aplicação exigir que os valores convertidos DateTime identifiquem inequivocamente um único ponto no tempo, deve considerar usar a propriedade DateTimeOffset.UtcDateTime para lidar com todas as conversões de DateTimeOffset para DateTime.

O código seguinte utiliza a propriedade UtcDateTime para converter um valor DateTimeOffset, cujo deslocamento é igual a TimeSpan.Zero, para um valor DateTime:

DateTimeOffset utcTime1 = new DateTimeOffset(2008, 6, 19, 7, 0, 0, TimeSpan.Zero);
DateTime utcTime2 = utcTime1.UtcDateTime;
Console.WriteLine($"{utcTime1} converted to {utcTime2} {utcTime2.Kind}");
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
Dim utcTime1 As New DateTimeOffset(#06/19/2008 7:00AM#, TimeSpan.Zero)
Dim utcTime2 As Date = utcTime1.UtcDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime1, _
                  utcTime2, _
                  utcTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc                              

O seguinte código utiliza a UtcDateTime propriedade para realizar tanto uma conversão de fuso horário como uma conversão de tipo sobre um DateTimeOffset valor:

DateTimeOffset originalTime = new DateTimeOffset(2008, 6, 19, 7, 0, 0, new TimeSpan(5, 0, 0));
DateTime utcTime = originalTime.UtcDateTime;
Console.WriteLine($"{originalTime} converted to {utcTime} {utcTime.Kind}");
// The example displays the following output to the console:
//       6/19/2008 7:00:00 AM +05:00 converted to 6/19/2008 2:00:00 AM Utc
Dim originalTime As New DateTimeOffset(#6/19/2008 7:00AM#, _
                                       New TimeSpan(5, 0, 0))
Dim utcTime As Date = originalTime.UtcDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalTime, _
                  utcTime, _
                  utcTime.Kind.ToString())
' The example displays the following output to the console:
'       6/19/2008 7:00:00 AM +05:00 converted to 6/19/2008 2:00:00 AM Utc

Converter uma hora local

Para indicar que um valor DateTimeOffset representa a hora local, pode passar o valor DateTime devolvido pela propriedade DateTimeOffset.DateTime ao método static (Shared em Visual Basic) SpecifyKind. O método devolve a data e a hora passadas como primeiro parâmetro, mas define a Kind propriedade para o valor especificado pelo segundo parâmetro. O seguinte código utiliza o SpecifyKind método ao converter um DateTimeOffset valor cujo deslocamento corresponde ao do fuso horário local:

DateTime sourceDate = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset utcTime1 = new DateTimeOffset(sourceDate,
                          TimeZoneInfo.Local.GetUtcOffset(sourceDate));
DateTime utcTime2 = utcTime1.DateTime;
if (utcTime1.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(utcTime1.DateTime)))
   utcTime2 = DateTime.SpecifyKind(utcTime2, DateTimeKind.Local);

Console.WriteLine($"{utcTime1} converted to {utcTime2} {utcTime2.Kind}");
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
Dim sourceDate As Date = #06/19/2008 7:00AM#
Dim utcTime1 As New DateTimeOffset(sourceDate, _
                                   TimeZoneInfo.Local.GetUtcOffset(sourceDate))
Dim utcTime2 As Date = utcTime1.DateTime
If utcTime1.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(utcTime1.DateTime)) Then
    utcTime2 = DateTime.SpecifyKind(utcTime2, DateTimeKind.Local)
End If
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime1, _
                  utcTime2, _
                  utcTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local      

Também pode usar a DateTimeOffset.LocalDateTime propriedade para converter um DateTimeOffset valor para um valor local DateTime . A Kind propriedade do valor devolvido DateTime é Local. O seguinte código utiliza a DateTimeOffset.LocalDateTime propriedade ao converter um DateTimeOffset valor cujo deslocamento corresponde ao do fuso horário local:

DateTime sourceDate = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset localTime1 = new DateTimeOffset(sourceDate,
                          TimeZoneInfo.Local.GetUtcOffset(sourceDate));
DateTime localTime2 = localTime1.LocalDateTime;

Console.WriteLine($"{localTime1} converted to {localTime2} {localTime2.Kind}");
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
Dim sourceDate As Date = #06/19/2008 7:00AM#
Dim localTime1 As New DateTimeOffset(sourceDate, _
                                   TimeZoneInfo.Local.GetUtcOffset(sourceDate))
Dim localTime2 As Date = localTime1.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  localTime1, _
                  localTime2, _
                  localTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local      

Quando recupera um DateTime valor usando a DateTimeOffset.LocalDateTime propriedade, o acessor da get propriedade primeiro converte o DateTimeOffset valor para UTC, depois converte-o para hora local chamando o ToLocalTime método. Este comportamento significa que pode obter um valor da DateTimeOffset.LocalDateTime propriedade para realizar uma conversão de fuso horário ao mesmo tempo que realiza uma conversão de tipo. Isso também significa que as regras de ajuste do fuso horário local são aplicadas na execução da conversão. O código seguinte ilustra a utilização da DateTimeOffset.LocalDateTime propriedade para realizar tanto uma conversão de tipo como de fuso horário. A saída de amostra é para uma máquina configurada para o fuso horário do Pacífico (EUA e Canadá). A data de novembro é a hora padrão do Pacífico, que é UTC-8, enquanto a data de junho é o horário de verão, que é UTC-7.

DateTimeOffset originalDate;
DateTime localDate;

// Convert time originating in a different time zone
originalDate = new DateTimeOffset(2008, 6, 18, 7, 0, 0,
                                  new TimeSpan(-5, 0, 0));
localDate = originalDate.LocalDateTime;
Console.WriteLine($"{originalDate} converted to {localDate} {localDate.Kind}");
// Convert time originating in a different time zone
// so local time zone's adjustment rules are applied
originalDate = new DateTimeOffset(2007, 11, 4, 4, 0, 0,
                                  new TimeSpan(-5, 0, 0));
localDate = originalDate.LocalDateTime;
Console.WriteLine($"{originalDate} converted to {localDate} {localDate.Kind}");
// The example displays the following output to the console,
// when you run it on a machine that is set to Pacific Time (US & Canada):
//       6/18/2008 7:00:00 AM -05:00 converted to 6/18/2008 5:00:00 AM Local
//       11/4/2007 4:00:00 AM -05:00 converted to 11/4/2007 1:00:00 AM Local
Dim originalDate As DateTimeOffset
Dim localDate As Date

' Convert time originating in a different time zone
originalDate = New DateTimeOffset(#06/19/2008 7:00AM#, _
                                  New TimeSpan(-5, 0, 0))
localDate = originalDate.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalDate, _
                  localDate, _
                  localDate.Kind.ToString())
' Convert time originating in a different time zone 
' so local time zone's adjustment rules are applied
originalDate = New DateTimeOffset(#11/04/2007 4:00AM#, _
                                  New TimeSpan(-5, 0, 0))
localDate = originalDate.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalDate, _
                  localDate, _
                  localDate.Kind.ToString())
' The example displays the following output to the console,
' when you run it on a machine that is set to Pacific Time (US & Canada):
'       6/18/2008 7:00:00 AM -05:00 converted to 6/18/2008 5:00:00 AM Local
'       11/4/2007 4:00:00 AM -05:00 converted to 11/4/2007 1:00:00 AM Local

Um método de conversão para fins gerais

O exemplo seguinte define um método chamado ConvertFromDateTimeOffset que converte DateTimeOffset valores em DateTime valores. Com base no seu deslocamento, determina se o valor de DateTimeOffset é um horário UTC, um horário local ou outro tipo de tempo, e ajusta a propriedade Kind da data e hora retornadas de acordo.

static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime)
{
   if (dateTime.Offset.Equals(TimeSpan.Zero))
      return dateTime.UtcDateTime;
   else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
      return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
   else
      return dateTime.DateTime;
}
Function ConvertFromDateTimeOffset(dateTime As DateTimeOffset) As Date
    If dateTime.Offset.Equals(TimeSpan.Zero) Then
        Return dateTime.UtcDateTime
    ElseIf dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))
        Return Date.SpecifyKind(dateTime.DateTime, DateTimeKind.Local)
    Else
        Return dateTime.DateTime
    End If
End Function

O exemplo seguinte chama o ConvertFromDateTimeOffset método para converter DateTimeOffset valores que representam uma hora UTC, uma hora local e uma hora no fuso horário Central dos EUA.

DateTime timeComponent = new DateTime(2008, 6, 19, 7, 0, 0);
DateTime returnedDate;

// Convert UTC time
DateTimeOffset utcTime = new DateTimeOffset(timeComponent, TimeSpan.Zero);
returnedDate = ConvertFromDateTimeOffset(utcTime);
Console.WriteLine($"{utcTime} converted to {returnedDate} {returnedDate.Kind}");

// Convert local time
DateTimeOffset localTime = new DateTimeOffset(timeComponent,
                           TimeZoneInfo.Local.GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(localTime);
Console.WriteLine($"{localTime} converted to {returnedDate} {returnedDate.Kind}");

// Convert Central Standard Time
DateTimeOffset cstTime = new DateTimeOffset(timeComponent,
               TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(cstTime);
Console.WriteLine($"{cstTime} converted to {returnedDate} {returnedDate.Kind}");
// The example displays the following output to the console:
//    6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
//    6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
//    6/19/2008 7:00:00 AM -05:00 converted to 6/19/2008 7:00:00 AM Unspecified
Dim timeComponent As Date = #06/19/2008 7:00AM#
Dim returnedDate As Date

' Convert UTC time
Dim utcTime As New DateTimeOffset(timeComponent, TimeSpan.Zero)
returnedDate = ConvertFromDateTimeOffset(utcTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())

' Convert local time
Dim localTime As New DateTimeOffset(timeComponent, _
                                    TimeZoneInfo.Local.GetUtcOffset(timeComponent))
returnedDate = ConvertFromDateTimeOffset(localTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  localTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())

' Convert Central Standard Time
Dim cstTime As New DateTimeOffset(timeComponent, _
               TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(timeComponent))
returnedDate = ConvertFromDateTimeOffset(cstTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  cstTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())
' The example displays the following output to the console:
'    6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
'    6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
'    6/19/2008 7:00:00 AM -05:00 converted to 6/19/2008 7:00:00 AM Unspecified

Observação

O código faz as duas suposições a seguir, dependendo do aplicativo e da origem de seus valores de data e hora, pode nem sempre ser válido:

  • Assume-se que um valor de data e hora cujo deslocamento seja TimeSpan.Zero representa o UTC. Na verdade, UTC não é uma hora em um fuso horário específico, mas a hora em relação à qual as horas nos fusos horários do mundo são padronizadas. Os fusos horários também podem ter um desfasamento de Zero.

  • Ele assume que uma data e hora cujo deslocamento é igual ao do fuso horário local representa o fuso horário local. Como os valores de data e hora são dissociados de seu fuso horário original, esse pode não ser o caso; A data e a hora podem ter se originado em outro fuso horário com o mesmo deslocamento.

Ver também