2011-05-27 28 views
10

estoy usando la estructura DateTimeWithZone que Jon Skeet publicada en Creating a DateTime in a specific Time Zone in c# fx 3.5Convertir DateTime a UTC sólo si no está ya Utc

Esto no funcionó exactamente para mi situación, ya que se supone que el DateTime pasado en el constructor es la hora local, y por lo tanto, lo convierte a Utc utilizando la TimeZone especificada.

En mi caso, generalmente pasaremos objetos DateTime que ya están en Utc (ya que esto es lo que estamos almacenando), así que solo debemos realizar la conversión si el DateTime.Kind fuente no es Utc.

lo que he cambiado el constructor para:

public DateTimeWithZone(DateTime dateTime, TimeZoneInfo timeZone, DateTimeKind kind = DateTimeKind.Utc) { 
     dateTime = DateTime.SpecifyKind(dateTime, kind); 
     utcDateTime = TimeZoneInfo.ConvertTimeToUtc(dateTime, timeZone); 
     this.timeZone = timeZone; 
    } 

Aquí tenemos un parámetro de tipo opcional que por defecto a la hora UTC.

Sin embargo, la ejecución de este código y pasar un Utc DateTime genera la siguiente excepción:

La conversión no pudo completarse debido a que el DateTime suministrado no tenía la propiedad Kind ajustado correctamente. Por ejemplo, cuando la propiedad Kind es DateTimeKind.Local, la zona horaria de origen debe ser TimeZoneInfo.Local.

Según los docs (http://msdn.microsoft.com/en-us/library/bb495915.aspx):

Si la propiedad Kind del parámetro dateTime es igual DateTimeKind.Utc y el parámetro es igual a sourceTimeZone TimeZoneInfo.Utc, este método devuelve dateTime sin realizar ninguna conversión.

Dado que tanto el tiempo de entrada como la zona horaria tienen una propiedad Kind de Utc, entonces no esperaría obtener esta excepción.

¿He entendido mal?

+0

¿Es su OS XP? – V4Vendetta

+0

No, es Windows 7 –

Respuesta

12

Al igual que la documentación de MSDN decir si pasa en un DateTime con el tipo establecido para nada, además de DateTimeKind.Utc y especifica un TimeZone que no sea Utc la función de conversión será una excepción. Eso debe ser lo que está sucediendo aquí. En su código, debe verificar si DateTime ya está en Utc y omitir la conversión si es así.

Además, dado que el dateTime que está pasando tendrá un DateTime conectado, probablemente ya no necesite pasar un parámetro Kind por separado.

del docs

convierte el tiempo en una zona horaria especificada al Tiempo Universal Coordinado (UTC).

lo que significa que se convierte de la zona horaria suministrada a UTC

la función lanza una excepción si el argumento:

fechaHora .Kind es DateTimeKind.Utc y sourceTimeZone no es igual a TimeZoneInfo.Utc.

-o-

fechaHora .Kind es DateTimeKind.Local y sourceTimeZone no es igual a TimeZoneInfo.Local.

-o-

sourceTimeZone .IsInvalidDateTime ( dateTime) devuelve verdadero.

+0

en el ejemplo anterior, tanto la fecha de entrada, la zona horaria de destino y la zona horaria local ('TimeZoneInfo.Local') tienen un tipo de DateTimeKind.Utc por lo que no debe producir una excepción. –

+0

@Ben Sí, debería. 'ConvertTimeToUtc' convierte ** de ** la zona horaria especificada en utc. si la zona horaria es la zona horaria local, entonces DateTime que está pasando debe ser de 'DateTimeKind.Local' – Yaur

+0

¿me puede indicar esto en los documentos? –

Cuestiones relacionadas