2011-08-22 10 views
5

Estoy tratando de convertir un String en un objeto Datetime sin que lo modifique y agregue una hora extra/offset al objeto Datetime.Ignorando el horario de verano (DST) en .NET

Este es el código:

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime date = Convert.ToDateTime(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + date.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

La salida:

Original string: 2011-03-18T12:07:00.000+10:00 
date toString: 2011-03-18T13:07:00.000+11:00 

Si alguien puede señalar cómo puedo ignorar el horario de verano o simplemente incluso convertir la fecha de regreso a lo que yo quiero como un objeto Datetime, eso sería muy apreciado.

Bajando por el camino de la modificación de la fecha y hora: He tratado de convertir la fecha y hora de regreso, pero no puedo encontrar la manera de cambiar la zona horaria en el objeto de fecha y hora, y cuando se utiliza un objeto DateTimeOffset para hacer este trabajo, cuando llamo al DatetimeOffset.Datetime devuelve la fecha y hora sin el desplazamiento

+0

¿Qué versión de .NET estás usando? –

+0

Esto está en .NET 3.5. ¿Hay una URL para Noda Time de Jon Skeet? – Eiji

+0

@Eiji, http://code.google.com/p/noda-time/ – Amy

Respuesta

0

clase TimeZoneInfo en plataforma .NET puede proporcionar la respuesta (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx)

string dateStr = "2011-03-18T12:07:00.000+10:00"; //Convert this string to datetime AS IS 

DateTime localDateTime = DateTime.Parse(date); 

DateTime utcDateTime = localDateTime.ToUniversalTime(); 
string estKey = "Eastern Standard Time"; 
TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById(estKey); 
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, estTimeZone); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("date toString: " + estDateTime); 
+0

Agradecemos la ayuda, pero desafortunadamente perdemos la compensación en ** estDatetime ** con ese método. – Eiji

3

Un DateTime objeto no contiene una zona horaria. Solo contiene un Kind, que puede ser Utc, Local o Unspecified.

Al llamar Convert.ToDateTime, si cualquier offset es presente, que compensado se aplicarán y entonces el valor será convertida a la zona horaria local de . Es decir, la zona horaria donde se está ejecutando el código.

Luego, al usar K en el formato de salida, devuelve el desplazamiento de la zona horaria local para esa fecha en particular.

Para hacer frente a este escenario correctamente, utilice el tipo DateTimeOffset:

string dateStr = "2011-03-18T12:07:00.000+10:00"; 

DateTimeOffset dto = DateTimeOffset.Parse(dateStr); 

Console.WriteLine("Original string: " + dateStr); 
Console.WriteLine("dto toString: " + dto.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffK")); 

En cuanto a su estado de cuenta:

cuando llamo al DatetimeOffset.Datetime devuelve la fecha y hora sin el desplazamiento

Eso es correcto. Solo el tipo DateTimeOffset tiene un desplazamiento para regresar. El objeto DateTime solo puede devolver local offset de la máquina, o cero para DateTime con DateTimeKind.Utc.

-1

DateTime dt = DateTime.Now.ToUniversalTime() + TimeZoneInfo.Local.BaseUtcOffset;

+0

Esto aplica correctamente la zona horaria dada mientras * ignora * DST, como se solicitó originalmente. – Timo

Cuestiones relacionadas