2009-08-24 22 views
39

En mi sitio, necesito saber en qué zona horaria se encuentran las personas, para mostrarles los mensajes en el momento adecuado. No estoy muy seguro de qué buscar en términos de un tutorial sobre cómo hacer esto.¿Cómo hacer zonas horarias en ASP.NET MVC?

Lo que planeo hacer es: cuando un usuario acceda a mi sitio, configurará su zona horaria seleccionándola de una lista desplegable. Almacenaré su configuración en mi base de datos y la usaré para calcular los tiempos.

No estoy seguro de lo que necesito. ¿Cuál debería ser el tiempo de mi base de datos almacenada? Leí en alguna parte que debería almacenarse como UTC. ¿Cómo configuro mi base de datos para hacer esto? Además, estaré en un sitio de alojamiento compartido, por lo que debe establecerse de manera que pueda hacerlo (¿quizás a través de webconfig?).

A continuación, necesitaría una lista de todas las zonas horarias como HTML helper o HTML normal. Realmente no quiero hacer uno.

Luego, como dije, necesito un tutorial que me muestre qué hacer. Creo que es sumar y restar cosas de ese momento, pero podría estar equivocado.

Respuesta

36

Para este propósito, definitivamente debe almacenar sus marcas de tiempo en UTC en la base de datos.

Cuando se necesita mostrar una fecha a partir de la base de datos en su sitio, usted puede hacer esto:

DateTime stamp = /* get datetime from the database here, make sure you 
        use the constructor that allows you to specify the 
        DateTimeKind as UTC. */ 

//E.g. 
//DateTime stamp = new DateTime(2009, 12, 12, 12, 12, 12, DateTimeKind.Utc); 

timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(" /* users time zone here */"); 
var convertedTime = TimeZoneInfo.ConvertTime(stamp, timeZoneInfo); 

//Print out the date and time 
//Console.WriteLine(convertedTime.ToString("yyyy-MM-dd HH-mm-ss")); 

La lista de zonas horarias ya está disponible en .Net, para que pueda ver this post on how to enumerate them. Para ASP.Net MVC, en lugar de imprimir el tiempo de espera, le gustaría asignar la fecha y hora convertida a una propiedad de su clase de modelo para que su vista pueda usarla para visualizarla.

+0

Hola Gracias, comenzaré a tratar de implementar esto. Tengo otro desconocido. ¿El usuario viene a mi sitio y quiero ir a través de la base de datos y ver qué mensajes mostrar en su zona horaria? Entonces, ¿primero averiguaría cuál es su tiempo y luego lo convertiría en UTC? entonces haz un lugar con eso? ¿Qué tipo de revertir lo que estás haciendo en tu ejemplo? – chobo2

+0

Bueno, inicialmente mencionaste permitiendo al usuario establecer su zona horaria. Sin embargo, hay una serie de métodos para descubrir la zona horaria del usuario a través de javascript, puede buscar alrededor de stackoverflow para obtener más información, por ejemplo, esta publicación: http://stackoverflow.com/questions/1017053/finding-the-clients-timezone- and-culture-via-web-service – womp

+0

Estoy bien con ellos eligiendo su zona horaria y realmente no quiero ver el javascript en este momento. Solo digo que sería así como empezaría a buscar fechas específicas en mi db? ¿Intentando convertir de nuevo a UTF? – chobo2

2

Primero, verifique la documentación de DateTime en MSDN y lea sobre ella. Here is an article sobre mejores prácticas con DateTime que cubre zonas horarias y UTC.

Sí, debe almacenar UTC en su base de datos. El almacenamiento de DateTimes como UTC le permitirá traducir tiempos a (y desde) usuarios según su zona horaria seleccionada. ¡Estás en el camino correcto!

9

No puedo enfatizar cuán importante es usar UTC para el almacenamiento y procesamiento de cualquier aplicación que escriba. Incluso si sabe que la aplicación solo se usará en una sola zona horaria, es mucho más fácil trabajar con UTC que con una zona horaria local debido a problemas de horario de verano.

No hay nada especial que deba hacer a nivel de la base de datos. Simplemente cree una columna de fecha y hora normal, pero asegúrese de que esté documentado claramente que se supone que la columna es UTC.

Seré honesto, asp.net no es mi experiencia, pero estoy pensando que podría obtener la zona horaria de la solicitud del cliente de alguna manera. En realidad, dado que las reglas del horario de verano pueden ser bastante oscuras dependiendo de la región, sería mejor usar un script java que calcule el desplazamiento UTC y lo use para realizar las conversiones. Incluso después de la Energy Policy Act de 2005, todavía hay algunas excepciones a las reglas de DST que sería bastante difícil de tratar en el lado del servidor. Sin embargo, creo que la idea de permitir que el cliente establezca su propia zona horaria funcionaría bien en la mayoría de los casos.

Cuestiones relacionadas