2010-09-18 28 views
5

Ejecución de asp.net mvc 2 en Win 7 con .NET 4.0TimeZoneInfo.ConvertTime no convierte nada

Tengo un método de acción controlador que recibe 2 objetos DateTime de una forma. La interfaz de usuario en el formulario utiliza el jQueryUi datepicker (no estoy seguro de si ese maters).

El usuario que completa ese formulario SIEMPRE ingresará la fecha/hora en la zona horaria de Hawai.

Quiero convertir eso a hora UTC y almacenarlo en una base de datos.

Cuando llamo a TimeZoneInfo.ConverTime (DateTime, TimeZoneInfo, TimeZoneInfo) devuelve el mismo datetime exacto que pasé sin hacer ninguna conversión. Revisé el depurador y lo único que cambió fue que cambió la propiedad DateTime.Kind a DateTimeKind.Utc.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

He intentado una versión alternativa con los mismos resultados.

public ActionResult New(ScheduleNew data){ 
    DateTime start = new DateTime(data.StartDate.Year, data.StartDate.Month, data.StartDate.Day, data.StartDate.Hour, data.StartDate.Minute, data.StartDate.Second, DateTimeKind.Unspecified); 
    DateTime end = new DateTime(data.EndDate.Year, data.EndDate.Month, data.EndDate.Day, data.EndDate.Hour, data.EndDate.Minute, data.EndDate.Second, DateTimeKind.Unspecified); 

    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    StartDate = TimeZoneInfo.ConvertTime(start, tz, TimeZoneInfo.Utc); 
    EndDate = TimeZoneInfo.ConvertTime(end, tz, TimeZoneInfo.Utc), 
} 

ScheduleData es sólo una clase modelo de vista sencillo con dos propiedades de fecha y hora llamados StartDate y EndDate.

Quiero destacar, no me importa dónde se encuentra el servidor, no me importa dónde se encuentra el usuario. El usuario siempre ingresará la hora en la zona horaria de Hawai, y el servidor siempre debe convertir esa fecha a UTC.

Básicamente lo que quiero es agregar 10 horas al tiempo que el usuario ingresa (hawaiano a utc) y podría lograrlo simplemente llamando .AddHours (10) y estaría bien. Pero más adelante, necesitaré que esta aplicación sea más flexible.

+0

¿resolvió el problema? – Rory

+0

¿Cuál fue el tipo de datos.StartDate? – Rory

Respuesta

4

Si desea enfoque más flexible, intentar algo como esto:

DateTime now = DateTime.UtcNow; 

TimeZoneInfo timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 
TimeSpan utcOffset = timeZoneInfo.GetUtcOffset(now); 
DateTime hawaiianTime = new DateTime(now.Ticks + utcOffset.Ticks, DateTimeKind.Local); 

Esto debería funcionar correctamente sin importar qué zona horaria está utilizando. Por cierto: si yo fuera usted, crearía fechas de inicio y finalización como DateTimeKind.Utc (y también almacenaría todos los datos de programación como UTC). No estoy seguro de cómo GetUtcOffset() trabajará con la clase de tiempo no especificado ...

Actualización sobre GetUtcOffset()

Parece que GetUtcOffset() funciona exactamente igual para DateTime creados con diferentes valores DateTimeKind. Sin embargo, no lo he probado con entradas no válidas (es decir, con fechas que no existen debido al cambio de horario de verano). Creo que DateTimeKind.Utc es bastante guardar aquí, pero podría ser Local o No especificado.

3

No encuentro ningún problema con tu código ... Parece que debería funcionar. ¿Ha probado la alternativa de:

DateTime start = TimeZoneInfo.ConvertTimeToUtc(data.StartDat, tz); 
2

probar este código

var dt = new DateTime(YourOldDate.Ticks, DateTimeKind.Utc); 
DateTime NewDate = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Local); 

Esto funcionó de mí, puede ser usted puede darle una oportunidad.

0

Parece ser que en el código no está haciendo nada con el resultado de la conversión.

public ActionResult New(ScheduleNew data){   
    TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Hawaiian Standard Time"); 

    DateTime start = TimeZoneInfo.ConvertTime(data.StartDate, tz, TimeZoneInfo.Utc); 
    DateTime end = TimeZoneInfo.ConvertTime(data.EndDate, tz, TimeZoneInfo.Utc); 
} 

Los start y end valores se establecen, pero nunca se devuelven. En realidad, aquí no se devuelve ningún valor, por lo que no debería compilarse. Quizás hay algo más que no mostraste.

En cualquier caso, la conversión en sí misma está bien. Siempre que data.StartDate y data.EndDate tengan el tipo Unspecified, entonces debería funcionar como se esperaba. Sin embargo, podrías hacerlo un poco más limpio usando TimeZoneInfo.ConvertTimeToUtc.