zona now horaria gettimezoneoffset ejemplos detectar javascript timezone

now - javascript timezoneoffset



Cree una fecha con una zona horaria establecida sin usar una representación de cadena (18)

Tengo una página web con tres menús desplegables por día, mes y año. Si uso el constructor de Date JavaScript que toma números, obtengo un objeto de Date para mi zona horaria actual:

new Date(xiYear, xiMonth, xiDate)

Indique la fecha correcta, pero cree que la fecha es GMT + 01: 00 debido al horario de verano.

El problema aquí es que luego paso esta Date a un método Ajax y cuando la fecha se deserializa en el servidor, se ha convertido a GMT y, por lo tanto, se pierde una hora, lo que hace retroceder el día en uno. Ahora solo puedo pasar el día, mes y año individualmente en el método Ajax, pero parece que debería haber una mejor manera.

La respuesta aceptada me indicó la dirección correcta, sin embargo, solo usando setUTCHours() cambió por sí mismo:

Apr 5th 00:00 GMT+01:00

a

Apr 4th 23:00 GMT+01:00

Luego también tuve que establecer la fecha UTC, mes y año para terminar con

Apr 5th 01:00 GMT+01:00

que es lo que yo quería.


Creo que necesita la función createDateAsUTC (compare con convertDateToUTC )

function createDateAsUTC(date) { return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds())); } function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }


Esta es la mejor solución

Utilizando:

// TO ALL dates Date.timezoneOffset(-240) // +4 UTC // Override offset only for THIS date new Date().timezoneOffset(-180) // +3 UTC

Código:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset(); Date.setTimezoneOffset = function(timezoneOffset) { return this.prototype.timezoneOffset = timezoneOffset; }; Date.getTimezoneOffset = function() { return this.prototype.timezoneOffset; }; Date.prototype.setTimezoneOffset = function(timezoneOffset) { return this.timezoneOffset = timezoneOffset; }; Date.prototype.getTimezoneOffset = function() { return this.timezoneOffset; }; Date.prototype.toString = function() { var offsetDate, offsetTime; offsetTime = this.timezoneOffset * 60 * 1000; offsetDate = new Date(this.getTime() - offsetTime); return offsetDate.toUTCString(); }; [''Milliseconds'', ''Seconds'', ''Minutes'', ''Hours'', ''Date'', ''Month'', ''FullYear'', ''Year'', ''Day''].forEach((function(_this) { return function(key) { Date.prototype["get" + key] = function() { var offsetDate, offsetTime; offsetTime = this.timezoneOffset * 60 * 1000; offsetDate = new Date(this.getTime() - offsetTime); return offsetDate["getUTC" + key](); }; return Date.prototype["set" + key] = function(value) { var offsetDate, offsetTime, time; offsetTime = this.timezoneOffset * 60 * 1000; offsetDate = new Date(this.getTime() - offsetTime); offsetDate["setUTC" + key](value); time = offsetDate.getTime() + offsetTime; this.setTime(time); return time; }; }; })(this));

Versión café:

Date.prototype.timezoneOffset = new Date().getTimezoneOffset() Date.setTimezoneOffset = (timezoneOffset)-> return @prototype.timezoneOffset = timezoneOffset Date.getTimezoneOffset = -> return @prototype.timezoneOffset Date.prototype.setTimezoneOffset = (timezoneOffset)-> return @timezoneOffset = timezoneOffset Date.prototype.getTimezoneOffset = -> return @timezoneOffset Date.prototype.toString = -> offsetTime = @timezoneOffset * 60 * 1000 offsetDate = new Date(@getTime() - offsetTime) return offsetDate.toUTCString() [ ''Milliseconds'', ''Seconds'', ''Minutes'', ''Hours'', ''Date'', ''Month'', ''FullYear'', ''Year'', ''Day'' ] .forEach (key)=> Date.prototype["get#{key}"] = -> offsetTime = @timezoneOffset * 60 * 1000 offsetDate = new Date(@getTime() - offsetTime) return offsetDate["getUTC#{key}"]() Date.prototype["set#{key}"] = (value)-> offsetTime = @timezoneOffset * 60 * 1000 offsetDate = new Date(@getTime() - offsetTime) offsetDate["setUTC#{key}"](value) time = offsetDate.getTime() + offsetTime @setTime(time) return time


Este código devolverá su objeto Fecha formateado con la zona horaria del navegador .

Date.prototype.timezone = function () { this.setHours(this.getHours() + (new Date().getTimezoneOffset() / 60)); return this; }


Esto funcionó para mí. Aunque no estoy seguro de si es una buena idea.

var myDate = new Date(); console.log(''myDate:'', myDate); // myDate: "2018-04-04T01:09:38.112Z" var offset = ''+5''; // e.g. if the timeZone is -5 var MyDateWithOffset = new Date( myDate.toGMTString() + offset ); console.log(''MyDateWithOffset:'', MyDateWithOffset); // myDateWithOffset: "2018-04-03T20:09:38.000Z"


Esto puede ayudar a alguien, ponga UTC al final de lo que le pasa al nuevo constructor

Al menos en Chrome puede decir var date = new Date("2014-01-01 11:00:00 UTC")


La forma más fácil que he encontrado para obtener la fecha correcta es usando datejs.

http://www.datejs.com/

Obtengo mis fechas a través de Ajax en este formato como una cadena: ''2016-01-12T00: 00: 00''

var yourDateString = ''2016-01-12T00:00:00''; var yourDate = new Date(yourDateString); console.log(yourDate); if (yourDate.getTimezoneOffset() > 0){ yourDate = new Date(yourDateString).addMinutes(yourDate.getTimezoneOffset()); } console.log(yourDate);

La consola leerá:

Lunes 11 de enero de 2016 19:00:00 GMT-0500 (hora estándar del este)

Mar 12 de enero de 2016 00:00:00 GMT-0500 (hora estándar del este)

https://jsfiddle.net/vp1ena7b/3/

Los ''addMinutes'' provienen de datejs, probablemente podrías hacer esto solo con js, pero ya tenía datejs en mi proyecto, así que encontré una forma de usarlo para obtener las fechas correctas.

Pensé que esto podría ayudar a alguien ...


La mejor solución que he visto de esto vino de

http://www.codingforums.com/archive/index.php/t-19663.html

Función de tiempo de impresión

<script language="javascript" type="text/javascript"> //borrowed from echoecho //http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482 workDate = new Date() UTCDate = new Date() UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000) function printTime(offset) { offset++; tempDate = new Date() tempDate.setTime(UTCDate.getTime()+3600000*(offset)) timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours())) timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes()) timeValue += " hrs." return timeValue } var now = new Date() var seed = now.getTime() % 0xfffffff var same = rand(12) </script> Banff, Canada: <script language="JavaScript">document.write(printTime("-7"))</script>

Ejemplo de código completo

<html> <head> <script language="javascript" type="text/javascript"> //borrowed from echoecho //http://www.echoecho.com/ubb/viewthread.php?tid=2362&pid=10482&#pid10482 workDate = new Date() UTCDate = new Date() UTCDate.setTime(workDate.getTime()+workDate.getTimezoneOffset()*60000) function printTime(offset) { offset++; tempDate = new Date() tempDate.setTime(UTCDate.getTime()+3600000*(offset)) timeValue = ((tempDate.getHours()<10) ? ("0"+tempDate.getHours()) : (""+tempDate.getHours())) timeValue += ((tempDate.getMinutes()<10) ? ("0"+tempDate.getMinutes()) : tempDate.getMinutes()) timeValue += " hrs." return timeValue } var now = new Date() var seed = now.getTime() % 0xfffffff var same = rand(12) </script> </head> <body> Banff, Canada: <script language="JavaScript">document.write(printTime("-7"))</script> <br> Michigan: <script language="JavaScript">document.write(printTime("-5"))</script> <br> Greenwich, England(UTC): <script language="JavaScript">document.write(printTime("-0"))</script> <br> Tokyo, Japan: <script language="JavaScript">document.write(printTime("+9"))</script> <br> Berlin, Germany: <script language="JavaScript">document.write(printTime("+1"))</script> </body> </html>


No creo que esto sea posible, ya que no se puede establecer la zona horaria en un objeto Fecha después de crearlo.

Y de alguna manera esto tiene sentido - conceptualmente (si no en la implementación); por http://en.wikipedia.org/wiki/Unix_timestamp (énfasis mío):

El tiempo de Unix, o tiempo de POSIX, es un sistema para describir instantes en el tiempo, definido como la cantidad de segundos transcurridos desde la medianoche Tiempo Universal Coordinado (UTC) del jueves 1 de enero de 1970.

Una vez que hayas construido uno, representará un cierto punto en tiempo "real". La zona horaria solo es relevante cuando desea convertir ese punto de tiempo abstracto en una cadena legible para el ser humano.

Por lo tanto, tiene sentido que solo pueda cambiar la hora real que representa la fecha en el constructor. Lamentablemente, parece que no hay forma de pasar a una zona horaria explícita, y el constructor al que está llamando (podría decirse correctamente) traduce sus variables de tiempo "locales" a GMT cuando las almacena de forma canónica, por lo que no hay manera de usar el int, int, int constructor para tiempos GMT.

En el lado positivo, es trivial usar el constructor que toma una cadena en su lugar. Ni siquiera tiene que convertir el mes numérico en una Cadena (al menos en Firefox), así que esperaba que una implementación ingenua funcionara. Sin embargo, después de probarlo, funciona correctamente en Firefox, Chrome y Opera, pero falla en Konqueror ("Fecha no válida"), Safari ("Fecha no válida") e IE ("NaN"). Supongo que solo tendrías una matriz de búsqueda para convertir el mes en una cadena, así:

var months = [ '''', ''January'', ''February'', ..., ''December'']; function createGMTDate(xiYear, xiMonth, xiDate) { return new Date(months[xiMonth] + '' '' + xiDate + '', '' + xiYear + '' 00:00:00 GMT''); }


Sé que esto es antiguo, pero si te ayuda, podrías usar la zona horaria de momento y momento. Si no los has visto echa un vistazo.

http://momentjs.com/timezone/

http://momentjs.com/

Dos bibliotecas de manipulación de tiempo realmente útiles.


Si desea lidiar con el problema ligeramente diferente, pero relacionado, de crear un objeto de fecha Javascript de año, mes, día, ..., incluida la zona horaria , es decir, si desea analizar una cadena en una fecha, entonces Al parecer hay que hacer una danza exasperadamente complicada:

// parseISO8601String : string -> Date // Parse an ISO-8601 date, including possible timezone, // into a Javascript Date object. // // Test strings: parseISO8601String(x).toISOString() // "2013-01-31T12:34" -> "2013-01-31T12:34:00.000Z" // "2013-01-31T12:34:56" -> "2013-01-31T12:34:56.000Z" // "2013-01-31T12:34:56.78" -> "2013-01-31T12:34:56.780Z" // "2013-01-31T12:34:56.78+0100" -> "2013-01-31T11:34:56.780Z" // "2013-01-31T12:34:56.78+0530" -> "2013-01-31T07:04:56.780Z" // "2013-01-31T12:34:56.78-0330" -> "2013-01-31T16:04:56.780Z" // "2013-01-31T12:34:56-0330" -> "2013-01-31T16:04:56.000Z" // "2013-01-31T12:34:56Z" -> "2013-01-31T12:34:56.000Z" function parseISO8601String(dateString) { var timebits = /^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2})(?::([0-9]*)(/.[0-9]*)?)?(?:([+-])([0-9]{2})([0-9]{2}))?/; var m = timebits.exec(dateString); var resultDate; if (m) { var utcdate = Date.UTC(parseInt(m[1]), parseInt(m[2])-1, // months are zero-offset (!) parseInt(m[3]), parseInt(m[4]), parseInt(m[5]), // hh:mm (m[6] && parseInt(m[6]) || 0), // optional seconds (m[7] && parseFloat(m[7])*1000) || 0); // optional fraction // utcdate is milliseconds since the epoch if (m[9] && m[10]) { var offsetMinutes = parseInt(m[9]) * 60 + parseInt(m[10]); utcdate += (m[8] === ''+'' ? -1 : +1) * offsetMinutes * 60000; } resultDate = new Date(utcdate); } else { resultDate = null; } return resultDate; }

Es decir, crea una ''hora UTC'' usando la fecha sin zona horaria (para saber en qué lugar se encuentra, a saber, ''locale'' UTC, y no está predeterminada a la local), y luego aplica manualmente el desplazamiento de zona horaria indicado.

¿No habría sido bueno si alguien hubiera pensado en el objeto de fecha de Javascript por más de, oooh, cinco minutos ...


Una solución de línea

new Date(new Date(1422524805305).getTime() - 330*60*1000)

En lugar de 1422524805305, use la marca de tiempo en milisegundos En lugar de 330, use el desplazamiento de la zona horaria en minutos wrt. GMT (por ejemplo, India +5: 30 es 5 * 60 + 30 = 330 minutos)


Utilicé el paquete timezone-js.

var timezoneJS = require(''timezone-js''); var tzdata = require(''tzdata'');

::

createDate(dateObj) { if ( dateObj == null ) { return null; } var nativeTimezoneOffset = new Date().getTimezoneOffset(); var offset = this.getTimeZoneOffset(); // use the native Date object if the timezone matches if ( offset == -1 * nativeTimezoneOffset ) { return dateObj; } this.loadTimeZones(); // FIXME: it would be better if timezoneJS.Date was an instanceof of Date // tried jquery $.extend // added hack to Fiterpickr to look for Dater.getTime instead of "d instanceof Date" return new timezoneJS.Date(dateObj,this.getTimeZoneName()); },


cualquier kilometraje en

var d = new Date(xiYear, xiMonth, xiDate).toLocaleString();


getTimeZoneOffset es menos para UTC + z.

var d = new Date(xiYear, xiMonth, xiDate); if(d.getTimezoneOffset() > 0){ d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 ); }


utilizando .setUTCHours() sería posible establecer fechas en tiempo UTC, lo que le permitiría usar los tiempos UTC en todo el sistema.

Sin embargo, no puede configurarlo utilizando UTC en el constructor, a menos que especifique una cadena de fecha.

Usando la new Date(Date.UTC(year, month, day, hour, minute, second)) puede crear un objeto Date a partir de una hora UTC específica.


// My clock 2018-07-25, 00:26:00 (GMT+7) let date = new Date(); // 2018-07-24:17:26:00 (Look like GMT+0) const myTimeZone = 7; // my timeZone // my timeZone = 7h = 7 * 60 * 60 * 1000 (millisecond); // 2018-07-24:17:26:00 = x (milliseconds) // finally, time in milliseconds (GMT+7) = x + myTimezone date.setTime( date.getTime() + myTimeZone * 60 * 60 * 1000 ); // date.toISOString() = 2018-07-25, 00:26:00 (GMT+7)


d = new Date(); utc = d.getTime() + (d.getTimezoneOffset() * 60000); nd = new Date(utc + (3600000*offset)); offset value base on which location time zone you would like to set For India offset value +5.5, New York offset value -4, London offset value +1

Lista de Wiki de desplazamiento de ubicación de todas las compensaciones de tiempo UTC


var d = new Date(xiYear, xiMonth, xiDate); d.setTime( d.getTime() + d.getTimezoneOffset()*60*1000 );

Esta respuesta se adapta específicamente a la pregunta original y no le dará la respuesta que necesariamente espera. En particular, algunas personas querrán restar el desplazamiento de la zona horaria en lugar de agregarlo. Sin embargo, recuerde que el objetivo principal de esta solución es hackear el objeto de fecha de javascript para una deserialización particular, no para ser correcto en todos los casos.