Zona horaria del cliente en ASP.NET

Tengo una tabla que necesita mostrar una date / hora en la zona horaria del cliente. Sin embargo, estoy teniendo dificultades para encontrar una manera de hacer esto de manera efectiva. Sé que puedo usar javascript del lado del cliente para get la zona horaria (y que este método es un poco escamoso), pero lo necesito en el evento Page_Load, por lo que no puedo llamar a javascript de antemano.

Puedo getlo de una página separada (al iniciar session, por ejemplo), pero eso no siempre funciona, porque a veces las personas usan marcadores directamente en las páginas internas y eludir el inicio de session con una cookie.

Así que me quedan algunas opciones: 1. Tener un caching por usuario para la última zona horaria que llene en cada oportunidad desde una devolución de datos sin garantía de que sea correcto)

  1. Prueba algún truco extraño de geolocation IP

  2. Tener un perfil de usuario que permita al usuario configurar su zona horaria (una vez más, si viajan, esto no siempre será correcto)

  3. Pruebe networkingirigir algunas páginas funky para forzar la devolución de datos, (pero algunos browseres deshabilitan la networkingirección de páginas)

  4. Haga que el usuario configure explícitamente el TZ

  5. Hacer el formatting tz en Javascript

Ninguno de estos son ideales, me parece que es información que el browser debe proporcionar al server. ¿Alguien tiene alguna otra sugerencia?

Si es posible, muestre times relativamente . En lugar de mostrar un momento en particular, usa prosa como "hace 5 minutos" o "la semana pasada".

Si debe mostrar un time absoluto en la zona horaria del cliente, de acuerdo con sus comentarios iría con la opción n. ° 5, enviando la hora UTC al browser y luego mostrando la hora local usando JavaScript. Según su descripción, parece que los usuarios pueden visitar las páginas que necesitan mostrar la hora en su zona horaria sin haber iniciado session, por lo que su almacenamiento en el perfil del usuario parece inadecuado.

Discuto el concepto de visualización de time relativo en más detalle en Consejos para almacenar y mostrar dates y horas en diferentes zonas horarias , así como también proporciono un método de extensión simple en la estructura DateTime para agregar un método ToRelativeDateString para que pueda escribir código como:

 string relativeTime = myDateTimeVariable.ToRelativeDateString(); 

Espero que esto ayude…

Usaría una estrategia mixta:

  1. Los usuarios pueden configurar la zona horaria en sus perfiles
  2. El valor pnetworkingeterminado es "auto", lo que significa: formatear con JavaScript

Sin embargo, conserve la zona horaria en el perfil del usuario en cada página que la muestre (o en la página maestra), y déle al usuario la posibilidad de ajustarla. Una vez que esté ajustado, permita que persista durante el rest de la session y, si lo desean, deberán configurarlo en su perfil.

5, 2, 3, 4, 1 es probablemente el mejor order de sus opciones.

Solo imprima todas las veces en UTC y luego transforme a hora local en el lado del cliente.

Tendría que estar de acuerdo con Scott Michael. Muestra la hora relativa, si necesitas horas absolutas, tu browser ya sabe cómo localizarlas desde UTC.

Pero si está buscando detectar zonas horarias de manera robusta con javascript (para uso del lado del server); echa un vistazo a jsTimezoneDetect . Le dará una key de zona horaria de Olsen que puede usar con las normalizaciones del lado del server de las dates.

Pensé en darte una actualización. Tomé las varias sugerencias de formatear la date en el lado del cliente (o más específicamente reformatearlo). Como forraje de Google, he puesto una explicación completa de esto al final de esta publicación.

Sin embargo, el problema es que Date.toLocaleString no toma parameters para controlar el formateo, por lo que, en mi configuration regional de EE. UU., Recibo una cadena grande y voluminosa "Sábado, 27 de noviembre de 2010 3:58:38 PM" Esto también es así voluminoso, quiero un formatting compacto como Sat 11/27/10 3:58 PM "pero no hay manera de controlarlo AFAIK.

Así que voy a modificar para tratar de almacenar en caching la zona horaria en la session en function de la input de las diversas páginas key que muestran el desplazamiento de la zona horaria, e include la capacidad de modificar el tz en el perfil del usuario. No es agradable, pero es lo mejor que se me ocurre. Como digo, esto realmente debería includese en los encabezados http del browser.

—– Formateo en el lado del cliente ————

Así que tengo tags como esta (en un ListView FWIW):

 <asp:Label ID="TimeLabel" runat="server" class="UTCTimeCell Hidden"> <%# Eval("when") %> UTC </asp:Label> 

Tenga en count que debe include UTC para la zona horaria, ya que el formateador ASP.NET pnetworkingeterminado no lo incluye. (Aquí supongo que está almacenando sus dates como UTC, lo que en casi todos los casos debería hacer). Nota Hidden es una class css estándar que utilicé con display: ninguna.

Luego defino las siguientes funciones en mis utilidades javascript (obviamente utilizo jQuery …)

 function timeFormatLocal(timeStr) { var dt = new Date(timeStr); return dt.toLocaleString(); } function timeReformatLocal(selector) { $(selector).each(function () { $(this).html(timeFormatLocal($(this).html())); }); } 

Luego, en el evento de mi página list, uso algo como esto:

 timeReformatLocal(".UTCTimeCell"); $(".UTCTimeCell").removeClass("Hidden"); 

Esto reformatea esas celdas de label al formatting basado en la configuration regional.