2010-09-01 21 views
12

Si mi usuario está en California y tienen su computadora configurada en PST, allí es la 1:00 p.m. Si mi servidor está configurado en EST, la hora actual del servidor es 4:00 p.m.Obtener la diferencia de zona horaria entre el cliente y el servidor

Necesito una manera de obtener la diferencia de zona horaria entre el cliente y el servidor, ya sea en Javascript o C#. En mi ejemplo, obtendría 3 (o -3, no importa).

¿Alguien sabe cómo hacer esto?

EDIT: Posible solución para RedFilter

Hacerlo todo en javascript:

serverDate = new Date('<%= DateTime.Now.ToString() %>'); 
clientDate = new Date(); 
diffMin = (serverDate.getTime()-clientDate.getTime())*1000*60; //get difference in minutes 

Piense que eso funcionaría? ¿O ambos regresarían al mismo tiempo?

+2

Si el servidor está configurado en EST, algo está mal. Debería ejecutarse en UTC. Eso eliminará tantos dolores de cabeza relacionados con las zonas horarias. –

+1

@Frederik No veo cómo eso realmente cambia las cosas. Si la aplicación necesita conocer el tiempo de compensación del cliente, necesita saber independientemente de la configuración de la zona horaria del servidor. – Pointy

+0

Mi servidor se está ejecutando realmente en UTC, acabo de utilizar EST como ejemplo para evitar todas las respuestas "hay funciones para convertir fechas a UTC", lo que no ayudaría con el problema que estoy teniendo. – Steven

Respuesta

13

Usted podría:

1 - Devolver la fecha del servidor al cliente como una variable de fecha Javascript.
2 - Cree una nueva fecha de javascript (var currentTime = new Date();) y reste la fecha anterior
3 - Envíe el resultado al servidor (si es necesario, puede que solo necesite saber la diferencia del lado del cliente).

actualización

Aquí se muestra un ejemplo:

serverDate = new Date('<%= DateTime.Now.ToString() %>'); 
clientDate = new Date(); 
diffMin = (serverDate.getTime()-clientDate.getTime())/(1000*60); 
alert("serverDate: " + serverDate + "\r\n" + "clientDate: " + clientDate + "\r\n" + 
    "diffMin: " + diffMin); 

Si el servidor y el cliente están en la misma máquina, verá un diffMin cercanos a cero. Hay una pequeña diferencia entre las fechas debido al tiempo entre el script del lado del servidor que genera la fecha y el análisis del navegador y la ejecución del javascript.

// Esto era útil para mí - DateTime.Now.ToString ("aaaa-MM-DDThh: mm: ss")

+0

Edité mi original, avíseme si cree que eso funcionaría. – Steven

+0

@Steven: ver mi actualización – RedFilter

+0

Gracias, esto terminó funcionando. – Steven

0

Una buena forma de comprobar la diferencia de zona horaria, es conocer la zona horaria (localización) donde se toma el tiempo. Si puede obtener eso del lado del cliente y del lado del servidor, puede verificar la clase TimeZoneInfo (necesita 3.5 creo) TimeZoneInfo from Koders.

Convierta el tiempo del cliente y del servidor con la zona asociada a UTC (ConvertTimeZoneToUtc) y compare los dos.

+0

Ese es el problema, no sé la zona horaria desde la que el cliente estará navegando, podría ser desde cualquier lugar. Si pudiera obtener esa información de alguna manera, sería útil, pero no sé cómo. – Steven

+0

Entonces me gustaría saber cómo obtiene el tiempo del cliente. Porque tengo un problema similar y lo resolví usando la ubicación de todos los contactos. Utilizo la ubicación de las ciudades asociada a una zona horaria. – Khan

1

¿Necesita conocer la zona horaria del lugar o de la máquina?

Si necesita conocer la zona horaria de la ubicación, la mejor opción es suscribirse a un servicio Geo-IP, verificar la dirección IP y consultar la zona horaria de esa ubicación (hay bases de datos disponibles al público para eso) . No está garantizado ya que la información geográfica de IP no está garantizada (y definitivamente no es solo una falta de garantía teórica, la información errónea abunda).

A menudo, sin embargo, lo que realmente desea es la configuración de la zona horaria de la máquina del cliente. Para la mayoría de los servicios, me resultaba molesto si viajaba y tenía un sitio web en el que pensaba que estaba en un momento diferente al que estaba trabajando (me atengo a mi zona horaria local si no estoy fuera de ella por mucho tiempo).

Esto se realiza fácilmente en el lado del cliente.new Date().getTimezoneOffset() devuelve la cantidad de minutos entre la hora UTC y la hora local. P.ej. Actualmente estoy en el horario de verano irlandés (GMT + 1 hora de ahorro de luz diurna), y devuelve -60.

Puede colocarlo fácilmente en un URI utilizado por una solicitud de imagen o XHR, o ponerlo en un valor de cookie.

Cuestiones relacionadas