2010-02-15 20 views
5

Tengo tiempos guardados en una base de datos sql en formato utc. Estoy mostrando esos tiempos en una vista de cuadrícula, sin embargo, siguen siendo formato UTC. Me gustaría convertirlos a la hora local de los navegadores del cliente. El problema es que, aunque puedo obtener el desplazamiento de la zona horaria solo para la fecha/hora actual. Esa compensación podría cambiar si algunas de esas fechas en el futuro terminan ocurriendo durante el horario de verano. Soy relativamente nuevo en la programación web, pero parece que lo que tengo que hacer es ejecutar JavaScript, ya que cada entrada se une a la vista de cuadrícula que de alguna manera toma el objeto C# datetimeoffset y lo convierte a una hora local. O tal vez eso no es posible?Muestra la hora local desde el tiempo utc almacenado en la base de datos sql en la aplicación asp.net

Respuesta

8

Esto se puede hacer en el lado del servidor si tiene un objeto TimeZoneInfo. Puede usar el método estático ConvertTimeFromUtc().

En C#:

DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(myDbDateTime, myTimeZoneInfo); 

Si usted no tiene la zona horaria en el servidor cosas secundarios se complican desde javascript no proporciona la zona horaria del cliente (a menos que estén en los EE.UU., e incluso entonces sólo en algunos navegadores). En este caso, puede ser mejor forzar al usuario a seleccionar su zona horaria actual y almacenarla en su cuenta. Si esto se muestra a usuarios anónimos, probablemente debería mostrarse en UTC de forma predeterminada y proporcionar una opción para actualizarlo para una zona horaria seleccionada.

actualización

Hay varios problemas que aparecen cuando se trata de determinar automáticamente la zona horaria de un usuario.

  1. Timezone no se proporciona en el servidor por el agente de usuario.
  2. JavaScript no proporciona acceso a la zona horaria (excepto en algunos navegadores, en ocasiones).

La función javascript getTimezoneOffset() puede sonar inicialmente como una buena idea, pero como hay múltiples zonas horarias con el mismo desplazamiento, este no es un valor único. La diferencia entre muchas de estas zonas no únicas es su implementación del horario de verano.

Ejemplo: Indiana no considera DST. Por lo tanto, durante la mitad del año, su compensación coincide con la hora del este, mientras que la otra mitad su compensación es igual al tiempo central.

Sin embargo, si su base de usuarios se encuentra principalmente en los EE.UU. y utiliza Internet Explorer, Chrome, Safari o Firefox, que se puede utilizar el método toString() en un objeto Date para obtener la zona horaria. Estos navegadores agregan la zona horaria a la cadena de fecha de diferentes maneras. Fuera de los EE. UU., La zona horaria no está incluida en todos los navegadores (aunque algunos aún pueden mostrarla).

abierto http://jsbin.com/onulo3 para observar:
IE8: dom 14 Feb 2010 22:12:22 EST
Chrome: Dom Feb 14 2010 22:12:22 GMT-0500 (Eastern Standard tiempo)
Safari: Dom Feb 14 2010 22:12:22 GMT-0500 (Eastern Standard Time)
Firefox: Dom Feb 14 2010 22:12:22 GMT-0500 (Eastern Standard T ime)

Con un poco de análisis, ahora puede determinar la zona horaria para todos sus usuarios estadounidenses. Para todos los demás, puede mostrar la hora en UTC (con un aviso a tal efecto).

+0

Espero hacerlo de forma que el usuario no necesite especificar una zona horaria y solo puedo obtener la zona horaria desde su navegador – JonF

+0

Pasamos mucho tiempo haciendo algo así en un proyecto reciente. Agregaré detalles a mi respuesta, pero la versión corta es: no se puede hacer de manera confiable. – Joel

-2

Aquí hay dos maneras de convertir.

Camino # 1: Si usted tiene la fecha y hora en segundos, desde la época definida formato, sólo tiene que utilizar algo como:

var d=new Date(seconds_since_epoch); 
document.write(d.toString()); 

Camino # 2: Si sólo tiene el año, mes, día, hora, minuto y segundo en el tiempo UTC, utilice:

var d=new Date(yyyy,mo-1,dd,hh,mi,ss); // in JavaScript, January is month 0 
document.write(d.toString()); 
Cuestiones relacionadas