En una aplicación JS, recibo la marca de tiempo (eq. 1270544790922
) Del servidor (Ajax).
Basándome en esa marca de tiempo, creo un Date
objeto usando:
var _date = new Date();
_date.setTime(1270544790922);
Ahora, _date
marca de tiempo decodificada en la zona horaria de la configuración regional del usuario actual. No quiero eso.
Me gustaría _date
convertir esta marca de tiempo a la hora actual en la ciudad de Helsinki en Europa (sin tener en cuenta la zona horaria actual del usuario).
¿Cómo puedo hacer eso?
javascript
date
timezone
warpech
fuente
fuente
Respuestas:
El valor subyacente de un objeto Date está realmente en UTC. Para probar esto, notará que si escribe
new Date(0)
usted verá algo como:Wed Dec 31 1969 16:00:00 GMT-0800 (PST)
. 0 se trata como 0 en GMT, pero el.toString()
método muestra la hora local.Nota importante: UTC significa código de tiempo universal . La hora actual en este momento en 2 lugares diferentes es la misma UTC, pero la salida se puede formatear de manera diferente.
Lo que necesitamos aquí es algo de formato.
Esto funciona, pero ... realmente no puede usar ninguno de los otros métodos de fecha para sus propósitos, ya que describen la zona horaria del usuario. Lo que desea es un objeto de fecha relacionado con la zona horaria de Helsinki. Sus opciones en este punto son usar alguna biblioteca de terceros (recomiendo esto), o piratear el objeto de fecha para que pueda usar la mayoría de sus métodos.
Opción 1: una zona horaria de momento de terceros
Esto parece mucho más elegante que lo que vamos a hacer a continuación.
Opción 2: piratear el objeto de fecha
Todavía piensa que es GMT-0700 (PDT), pero si no mira demasiado fijamente, puede confundirlo con un objeto de fecha que sea útil para sus propósitos.
Convenientemente me salté una parte. Necesitas poder definir
currentHelsinkiOffset
. Si puede usardate.getTimezoneOffset()
en el lado del servidor, o simplemente usar algunas declaraciones if para describir cuándo ocurrirán los cambios de zona horaria, eso debería resolver su problema.Conclusión : creo que, especialmente para este propósito, debe usar una biblioteca de fechas como moment-timezone .
fuente
*60*60
debería ser*60000
, en cambio , ya que getTime está en milisegundos y getTimezoneOffset está en minutos, de los cuales hay 60000 milisegundos en un minuto, no 60 * 60 == 3600Para tener en cuenta los milisegundos y la zona horaria del usuario, utilice lo siguiente:
fuente
Solo otro enfoque
¡Salud!
fuente
new Date().getTimezoneOffset()
debe cambiarse anew Date(timestampStr).getTimezoneOffset()
Tengo la sospecha de que la Respuesta no da el resultado correcto. En la pregunta, el autor de la pregunta quiere convertir la marca de tiempo del servidor a la hora actual en Hellsinki sin tener en cuenta la zona horaria actual del usuario.
Es el hecho de que la zona horaria del usuario puede ser lo que sea, por lo que no podemos confiar en ella.
Si por ejemplo. La marca de tiempo es 1270544790922 y tenemos una función:
Cuando un neoyorquino visita la página, la alerta (_helsenkiTime) imprime:
Y cuando un finlandés visita la página, la alerta (_helsenkiTime) imprime:
Por lo tanto, la función es correcta solo si el visitante de la página tiene la zona horaria objetivo (Europa / Helsinki) en su computadora, pero falla en casi todas las demás partes del mundo. Y debido a que la marca de tiempo del servidor suele ser la marca de tiempo de UNIX, que por definición está en UTC, el número de segundos desde la época de Unix (1 de enero de 1970 a las 00:00:00 GMT), no podemos determinar DST o no DST a partir de la marca de tiempo.
Entonces, la solución es DESCONECTAR la zona horaria actual del usuario e implementar alguna forma de calcular la compensación UTC si la fecha está en DST o no. Javascript no tiene un método nativo para determinar el historial de transición DST de otra zona horaria que la zona horaria actual del usuario. Podemos lograr esto de la manera más simple usando el script del lado del servidor, porque tenemos fácil acceso a la base de datos de la zona horaria del servidor con el historial de transición completo de todas las zonas horarias.
Pero si no tiene acceso a la base de datos de la zona horaria del servidor (o de cualquier otro servidor) Y la marca de tiempo está en UTC, puede obtener una funcionalidad similar codificando las reglas de DST en Javascript.
Para cubrir fechas en los años 1998 - 2099 en Europa / Helsinki, puede utilizar la siguiente función ( jsfiddled ):
Ejemplos de uso:
Y esto imprime lo siguiente independientemente de la zona horaria del usuario:
Por supuesto, si puede devolver la marca de tiempo en una forma en la que el desplazamiento (DST o no DST) ya está agregado a la marca de tiempo en el servidor, no tiene que calcularlo en el lado del cliente y puede simplificar mucho la función. PERO recuerde NO usar timezoneOffset (), porque entonces tiene que lidiar con la zona horaria del usuario y este no es el comportamiento deseado.
fuente
Suponiendo que obtenga la marca de tiempo en la hora de Helsinki, crearía un objeto de fecha establecido en la medianoche del 1 de enero de 1970 UTC (para ignorar la configuración de la zona horaria local del navegador). Luego, simplemente agregue la cantidad necesaria de milisegundos.
Tenga cuidado más tarde, para preguntar siempre los valores UTC del objeto de fecha. De esta forma, los usuarios verán los mismos valores de fecha independientemente de la configuración local. De lo contrario, los valores de fecha se cambiarán según la configuración de la hora local.
fuente
Podrías usar
setUTCMilliseconds()
fuente
setUTCMilliseconds()
método establece los milisegundos para una fecha específica de acuerdo con la hora universal. [...] Si un parámetro que especifica está fuera del rango esperado,setUTCMilliseconds()
intenta actualizar la información de fecha en el objeto Fecha en consecuencia. En otras palabras, crea unDate
objeto con la marca de tiempo Unix dada, en UTC.