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

Tengo una página web con tres menús desplegables para día, mes y año. Si uso JavaScript Date constructor que toma números, luego obtengo un Date objeto 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 esto 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 que el día retroceda uno. Ahora podría pasar el día, el mes y el año individualmente al método Ajax, pero parece que debería haber una mejor manera.

La respuesta aceptada me apuntó en la dirección correcta, sin embargo, solo usé setUTCHours() por sí mismo cambiado:

Apr 5th 00:00 GMT+01:00 

a

Apr 4th 23:00 GMT+01:00

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

Apr 5th 01:00 GMT+01:00

que es lo que quería.

preguntado el 13 de enero de 09 a las 14:01

Si la respuesta aceptada le indicó la dirección correcta pero no respondió a su pregunta, yo diría que no debería ser la respuesta aceptada. La respuesta debe responder a la pregunta formulada. -

25 Respuestas

usando .setUTCHours() sería posible establecer fechas en hora UTC, lo que le permitiría utilizar las horas UTC en todo el sistema.

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

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

Respondido 01 Abr '16, 14:04

La sintaxis "new Date (Date.UTC (...))" le permite crear una fecha que sea equivalente a una fecha UTC en términos del punto en el tiempo que representa, pero no es lo mismo: tiene una zona horaria diferente (no UTC). - Antonio

Tenga en cuenta que al usar "Fecha", el valor del "mes" tiene un rango de 0-11 (no 1-12). Seguí obteniendo una compensación de zona horaria de 2 h (mientras que debería haber sido 1 h) y me tomó horas descubrir que la razón era un mes equivocado. - Seleccionar0r

Esta respuesta es genial. Pero estoy usando una biblioteca [datepicker ui] que usa new Date en muchos lugares. Todo lo que quiero es establecer la zona horaria UTC y cada fecha es según la nueva zona horaria. Me sorprende que Javascript no tenga nada para esto. - Sanjeev Kumar Dangi

@ jishi: los objetos de fecha se basan en un valor de hora UTC, no en la hora local. Sin embargo, el valor predeterminado Fecha.prototipo.toString el método será la visualización valores de hora local. - robar

@Antonio-"pero no es la misma hora"no es correcto. Representa exactamente el mismo momento en el tiempo, la única diferencia es el desplazamiento de la zona horaria. - robar

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 de esta solución es piratear el objeto de fecha de JavaScript para una deserialización particular, no para ser correcto en todos los casos.

Respondido 29 ago 18, 19:08

@gthmb por supuesto, pero siento que *60*1000 es más claro en este caso; en otras palabras, es bastante evidente por qué está ahí. - TWR Cole

Esto casi funciona para mí, excepto que tengo que usar - (menos) en lugar de + (más) para obtener la hora correcta para mi zona horaria. - Wytzé

Sí, como han señalado otros, creo que hay un error en esta respuesta. Debe ser menos, no más. - Hasta el arroyo

Según desarrollador.mozilla.org/en-US/docs/Web/JavaScript/Reference/… el valor devuelto por getTimezoneOffset está firmado de acuerdo con el desplazamiento real en su configuración regional en el momento en que llama a la función, lo que incluye tener en cuenta el horario de verano, por lo que no entiendo por qué tendría que restarlo. - TWR Cole

Si agrega timezoneOffset al objeto de fecha, su valor con el formato de la zona horaria local se verá como el valor correcto en UTC, pero aún tendrá el desplazamiento de la zona horaria original (y algunas representaciones como "ISOString" realmente lo mostrarán). Entonces, dependiendo de cómo serialice el objeto de fecha, JS podría aplicar el desplazamiento de zona horaria de nuevo, dándote la respuesta incorrecta. Creo que esto es responsable de la confusión en estos comentarios entre +/-. De todos modos, mi voto negativo es por este hecho y también por el "en la mayoría de los casos obtienes lo que esperas". - metamate

Creo que necesitas el crearFechaAsUTC función (por favor compare con convertirFechaAUTC)

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()); 
}

Respondido el 11 de diciembre de 15 a las 15:12

Estoy asombrado por la claridad y utilidad de su respuesta. No sabía que trabajar con fechas de Javascript era una pesadilla hasta hoy: S - Willxnumx

¿Te importaría explicar la diferencia entre los dos? Los primeros conversos date en la zona horaria UTC, pero el segundo parece no hacer nada útil? (devuelve la misma fecha que date) - jonathan lin

Lo entiendo ahora: el primero devuelve la fecha en la zona horaria UTC, con los valores de fecha literal de la hora local. El segundo devuelve la fecha en la zona horaria local, pero con los valores de fecha literal UTC. - jonathan lin

Este enfoque es una implementación de un patrón llamado "cambio de época", que tiene la intención de mover la época (que está basada en UTC) a una que está desplazada por el desplazamiento de la zona horaria actual. Desafortunadamente, aunque esto se ve comúnmente, este enfoque es defectuoso. JavaScript Date El objeto siempre reflejará la época Unix basada en UTC, y la locales zona horaria. El síntoma es evidente cuando llamas toString en el objeto de fecha resultante y seguir viendo la zona horaria local, aunque esperaba que estuviera en UTC. - Matt Johnson-Pinta

También puede causar errores en los valores de la hora, cerca de las transiciones del horario de verano de la zona horaria local. En resumen, el cambio de época (a través de cualquier implementación) no funciona con JavaScript Date objeto. Otra forma de ver esto aquí es que Date.UTC espera valores basados ​​en UTC, y lo está alimentando con valores de hora local, y viceversa con el Date constructor. - Matt Johnson-Pinta

Simplemente configure la zona horaria y vuelva según

new Date().toLocaleString("en-US", {timeZone: "America/New_York"})

Otros Zonas horarias son los siguientes

var world_timezones =
[
    'Europe/Andorra',
    'Asia/Dubai',
    'Asia/Kabul',
    'Europe/Tirane',
    'Asia/Yerevan',
    'Antarctica/Casey',
    'Antarctica/Davis',
    'Antarctica/DumontDUrville', 
    'Antarctica/Mawson',
    'Antarctica/Palmer',
    'Antarctica/Rothera',
    'Antarctica/Syowa',
    'Antarctica/Troll',
    'Antarctica/Vostok',
    'America/Argentina/Buenos_Aires',
    'America/Argentina/Cordoba',
    'America/Argentina/Salta',
    'America/Argentina/Jujuy',
    'America/Argentina/Tucuman',
    'America/Argentina/Catamarca',
    'America/Argentina/La_Rioja',
    'America/Argentina/San_Juan',
    'America/Argentina/Mendoza',
    'America/Argentina/San_Luis',
    'America/Argentina/Rio_Gallegos',
    'America/Argentina/Ushuaia',
    'Pacific/Pago_Pago',
    'Europe/Vienna',
    'Australia/Lord_Howe',
    'Antarctica/Macquarie',
    'Australia/Hobart',
    'Australia/Currie',
    'Australia/Melbourne',
    'Australia/Sydney',
    'Australia/Broken_Hill',
    'Australia/Brisbane',
    'Australia/Lindeman',
    'Australia/Adelaide',
    'Australia/Darwin',
    'Australia/Perth',
    'Australia/Eucla',
    'Asia/Baku',
    'America/Barbados',
    'Asia/Dhaka',
    'Europe/Brussels',
    'Europe/Sofia',
    'Atlantic/Bermuda',
    'Asia/Brunei',
    'America/La_Paz',
    'America/Noronha',
    'America/Belem',
    'America/Fortaleza',
    'America/Recife',
    'America/Araguaina',
    'America/Maceio',
    'America/Bahia',
    'America/Sao_Paulo',
    'America/Campo_Grande',
    'America/Cuiaba',
    'America/Santarem',
    'America/Porto_Velho',
    'America/Boa_Vista',
    'America/Manaus',
    'America/Eirunepe',
    'America/Rio_Branco',
    'America/Nassau',
    'Asia/Thimphu',
    'Europe/Minsk',
    'America/Belize',
    'America/St_Johns',
    'America/Halifax',
    'America/Glace_Bay',
    'America/Moncton',
    'America/Goose_Bay',
    'America/Blanc-Sablon',
    'America/Toronto',
    'America/Nipigon',
    'America/Thunder_Bay',
    'America/Iqaluit',
    'America/Pangnirtung',
    'America/Atikokan',
    'America/Winnipeg',
    'America/Rainy_River',
    'America/Resolute',
    'America/Rankin_Inlet',
    'America/Regina',
    'America/Swift_Current',
    'America/Edmonton',
    'America/Cambridge_Bay',
    'America/Yellowknife',
    'America/Inuvik',
    'America/Creston',
    'America/Dawson_Creek',
    'America/Fort_Nelson',
    'America/Vancouver',
    'America/Whitehorse',
    'America/Dawson',
    'Indian/Cocos',
    'Europe/Zurich',
    'Africa/Abidjan',
    'Pacific/Rarotonga',
    'America/Santiago',
    'America/Punta_Arenas',
    'Pacific/Easter',
    'Asia/Shanghai',
    'Asia/Urumqi',
    'America/Bogota',
    'America/Costa_Rica',
    'America/Havana',
    'Atlantic/Cape_Verde',
    'America/Curacao',
    'Indian/Christmas',
    'Asia/Nicosia',
    'Asia/Famagusta',
    'Europe/Prague',
    'Europe/Berlin',
    'Europe/Copenhagen',
    'America/Santo_Domingo',
    'Africa/Algiers',
    'America/Guayaquil',
    'Pacific/Galapagos',
    'Europe/Tallinn',
    'Africa/Cairo',
    'Africa/El_Aaiun',
    'Europe/Madrid',
    'Africa/Ceuta',
    'Atlantic/Canary',
    'Europe/Helsinki',
    'Pacific/Fiji',
    'Atlantic/Stanley',
    'Pacific/Chuuk',
    'Pacific/Pohnpei',
    'Pacific/Kosrae',
    'Atlantic/Faroe',
    'Europe/Paris',
    'Europe/London',
    'Asia/Tbilisi',
    'America/Cayenne',
    'Africa/Accra',
    'Europe/Gibraltar',
    'America/Godthab',
    'America/Danmarkshavn',
    'America/Scoresbysund',
    'America/Thule',
    'Europe/Athens',
    'Atlantic/South_Georgia',
    'America/Guatemala',
    'Pacific/Guam',
    'Africa/Bissau',
    'America/Guyana',
    'Asia/Hong_Kong',
    'America/Tegucigalpa',
    'America/Port-au-Prince',
    'Europe/Budapest',
    'Asia/Jakarta',
    'Asia/Pontianak',
    'Asia/Makassar',
    'Asia/Jayapura',
    'Europe/Dublin',
    'Asia/Jerusalem',
    'Asia/Kolkata',
    'Indian/Chagos',
    'Asia/Baghdad',
    'Asia/Tehran',
    'Atlantic/Reykjavik',
    'Europe/Rome',
    'America/Jamaica',
    'Asia/Amman',
    'Asia/Tokyo',
    'Africa/Nairobi',
    'Asia/Bishkek',
    'Pacific/Tarawa',
    'Pacific/Enderbury',
    'Pacific/Kiritimati',
    'Asia/Pyongyang',
    'Asia/Seoul',
    'Asia/Almaty',
    'Asia/Qyzylorda',
    'Asia/Qostanay', 
    'Asia/Aqtobe',
    'Asia/Aqtau',
    'Asia/Atyrau',
    'Asia/Oral',
    'Asia/Beirut',
    'Asia/Colombo',
    'Africa/Monrovia',
    'Europe/Vilnius',
    'Europe/Luxembourg',
    'Europe/Riga',
    'Africa/Tripoli',
    'Africa/Casablanca',
    'Europe/Monaco',
    'Europe/Chisinau',
    'Pacific/Majuro',
    'Pacific/Kwajalein',
    'Asia/Yangon',
    'Asia/Ulaanbaatar',
    'Asia/Hovd',
    'Asia/Choibalsan',
    'Asia/Macau',
    'America/Martinique',
    'Europe/Malta',
    'Indian/Mauritius',
    'Indian/Maldives',
    'America/Mexico_City',
    'America/Cancun',
    'America/Merida',
    'America/Monterrey',
    'America/Matamoros',
    'America/Mazatlan',
    'America/Chihuahua',
    'America/Ojinaga',
    'America/Hermosillo',
    'America/Tijuana',
    'America/Bahia_Banderas',
    'Asia/Kuala_Lumpur',
    'Asia/Kuching',
    'Africa/Maputo',
    'Africa/Windhoek',
    'Pacific/Noumea',
    'Pacific/Norfolk',
    'Africa/Lagos',
    'America/Managua',
    'Europe/Amsterdam',
    'Europe/Oslo',
    'Asia/Kathmandu',
    'Pacific/Nauru',
    'Pacific/Niue',
    'Pacific/Auckland',
    'Pacific/Chatham',
    'America/Panama',
    'America/Lima',
    'Pacific/Tahiti',
    'Pacific/Marquesas',
    'Pacific/Gambier',
    'Pacific/Port_Moresby',
    'Pacific/Bougainville',
    'Asia/Manila',
    'Asia/Karachi',
    'Europe/Warsaw',
    'America/Miquelon',
    'Pacific/Pitcairn',
    'America/Puerto_Rico',
    'Asia/Gaza',
    'Asia/Hebron',
    'Europe/Lisbon',
    'Atlantic/Madeira',
    'Atlantic/Azores',
    'Pacific/Palau',
    'America/Asuncion',
    'Asia/Qatar',
    'Indian/Reunion',
    'Europe/Bucharest',
    'Europe/Belgrade',
    'Europe/Kaliningrad',
    'Europe/Moscow',
    'Europe/Simferopol',
    'Europe/Kirov',
    'Europe/Astrakhan',
    'Europe/Volgograd',
    'Europe/Saratov',
    'Europe/Ulyanovsk',
    'Europe/Samara',
    'Asia/Yekaterinburg',
    'Asia/Omsk',
    'Asia/Novosibirsk',
    'Asia/Barnaul',
    'Asia/Tomsk',
    'Asia/Novokuznetsk',
    'Asia/Krasnoyarsk',
    'Asia/Irkutsk',
    'Asia/Chita',
    'Asia/Yakutsk',
    'Asia/Khandyga',
    'Asia/Vladivostok',
    'Asia/Ust-Nera',
    'Asia/Magadan',
    'Asia/Sakhalin',
    'Asia/Srednekolymsk',
    'Asia/Kamchatka',
    'Asia/Anadyr',
    'Asia/Riyadh',
    'Pacific/Guadalcanal',
    'Indian/Mahe',
    'Africa/Khartoum',
    'Europe/Stockholm',
    'Asia/Singapore',
    'America/Paramaribo',
    'Africa/Juba',
    'Africa/Sao_Tome',
    'America/El_Salvador',
    'Asia/Damascus',
    'America/Grand_Turk',
    'Africa/Ndjamena',
    'Indian/Kerguelen',
    'Asia/Bangkok',
    'Asia/Dushanbe',
    'Pacific/Fakaofo',
    'Asia/Dili',
    'Asia/Ashgabat',
    'Africa/Tunis',
    'Pacific/Tongatapu',
    'Europe/Istanbul',
    'America/Port_of_Spain',
    'Pacific/Funafuti',
    'Asia/Taipei',
    'Europe/Kiev',
    'Europe/Uzhgorod',
    'Europe/Zaporozhye',
    'Pacific/Wake',
    'America/New_York',
    'America/Detroit',
    'America/Kentucky/Louisville',
    'America/Kentucky/Monticello',
    'America/Indiana/Indianapolis',
    'America/Indiana/Vincennes',
    'America/Indiana/Winamac',
    'America/Indiana/Marengo',
    'America/Indiana/Petersburg',
    'America/Indiana/Vevay',
    'America/Chicago',
    'America/Indiana/Tell_City',
    'America/Indiana/Knox',
    'America/Menominee',
    'America/North_Dakota/Center',
    'America/North_Dakota/New_Salem',
    'America/North_Dakota/Beulah',
    'America/Denver',
    'America/Boise',
    'America/Phoenix',
    'America/Los_Angeles',
    'America/Anchorage',
    'America/Juneau',
    'America/Sitka',
    'America/Metlakatla',
    'America/Yakutat',
    'America/Nome',
    'America/Adak',
    'Pacific/Honolulu',
    'America/Montevideo',
    'Asia/Samarkand',
    'Asia/Tashkent',
    'America/Caracas',
    'Asia/Ho_Chi_Minh',
    'Pacific/Efate',
    'Pacific/Wallis',
    'Pacific/Apia',
    'Africa/Johannesburg'
];

Respondido 09 Oct 19, 10:10

Esto debería estar muy arriba en la parte superior: Eugene

Excepto tenga en cuenta que esto no funciona en algunos navegadores. P.ej. IE11. - Paul LeBeau

Error en la consola IE: El valor de opción 'AMERICA / NEW_YORK' para 'timeZone' está fuera del rango válido. Esperado: ['UTC'] @OloghoCyrilPaul - Matee Gojra

Muy fácil, muy elegante. Puede encontrar aquí una lista con todas las zonas horarias stackoverflow.com/questions/38399465/… . Para UTC, elija la zona horaria de Londres. - EPurpl3

Ninguno de esos valores son "zonas horarias", son Base de datos de zona horaria de IANA ubicaciones representativas para lugares que tienen la misma zona horaria local histórica y cambios de horario de verano. - robar

No creo que esto sea posible, no existe la posibilidad de establecer la zona horaria en un objeto Date después de su creación.

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

El tiempo Unix, o tiempo POSIX, es un sistema para describir instantes en el tiempo, definido como el número de segundos transcurridos desde la medianoche. Hora universal coordinada (UTC) del jueves 1 de enero de 1970.

Una vez que haya 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 por humanos.

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 una zona horaria explícita, y el constructor al que está llamando (posiblemente correctamente) traduce sus variables de tiempo "local" a GMT cuando las almacena canónicamente, por lo que no hay forma de usar el int, int, int constructor para las horas GMT.

En el lado positivo, es trivial usar el constructor que toma String en su lugar. Ni siquiera tiene que convertir el mes numérico en una cadena (al menos en Firefox), por lo que esperaba que una implementación ingenua funcionara. Sin embargo, después de probarlo, funciona con éxito 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ía 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');
}

Respondido 05 Abr '12, 22:04

Si no hay forma de "establecer la zona horaria en un objeto Date después de su creación", ¿estás insinuando que hay una forma de establecer la zona horaria en un objeto Date? as se crea? No parece que una fecha js sea "una envoltura delgada alrededor de una cantidad de segundos desde la Época"; parece que es esa cuenta de segundos, más una zona horaria. - Antonio

@Anthony, solo puede usar la zona horaria del cliente. Javascript puede hacer local a utc y viceversa, pero no hay acceso a una base de datos de zona horaria. No puede, por ejemplo, decirle la hora en la Ciudad de México cuando está en San Diego. - samuel danielson

Sé que esto es antiguo, pero si te ayuda, puedes usar la zona horaria de momento y momento. Si no los ha visto, eche un vistazo.

http://momentjs.com/timezone/

http://momentjs.com/

dos bibliotecas de manipulación del tiempo realmente útiles.

Respondido el 13 de enero de 15 a las 15:01

Si desea lidiar con el problema ligeramente diferente, pero relacionado, de crear un objeto Fecha de Javascript de año, mes, día, ..., incluyendo zona horaria - es decir, si desea analizar una cadena en una fecha, entonces aparentemente tiene que hacer un baile exasperantemente complicado:

// 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 que sepa en qué configuración regional se encuentra, es decir, la 'configuración regional' UTC, y no está predeterminada en la local), y luego aplica manualmente el desplazamiento de zona horaria indicado.

¿No hubiera sido bueno si alguien hubiera pensamiento sobre el objeto de fecha de Javascript durante más de, oooh, cinco minutos ...

Respondido el 31 de enero de 13 a las 22:01

gracias por la gran función! lo único que cambiaría es agregar soporte para los dos puntos en el desplazamiento de la zona horaria. var bits de tiempo = / ^ ([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}))? /; - roberto

Lo pensaron; desafortunadamente, "ellos" fueron los diseñadores del lenguaje Java, ya que JS acaba de copiar la clase Date de Java para su implementación inicial. - Xanthir

@Xanthir Oooh, tienes razón, y había olvidado lo horrible que era el objeto Java Date original; pero al menos Java lo desaprobó y siguió adelante, algo que Javascript parece incapaz de hacer (es un lenguaje extraño, Javascript: bastante lindo, y no tan horrible como parece ser). - Norman Grey

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

para todos los desplazamientos de ubicación Lista Wiki de desplazamientos de hora UTC

Respondido el 10 de junio de 16 a las 15:06

¿Cómo ayuda esto a Nueva York durante el horario de verano? - frederj

Para Nueva York, utilice el valor de compensación -4 - Vijay Lathiya

La compensación para Nueva York varía según el horario de verano. A veces es -4 y a veces es -5 en.wikipedia.org/wiki/Eastern_Time_Zone - frederj

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 );
}

Respondido 31 Jul 14, 16:07

Un pequeño error,! = 0 no> 0. Terminé usando esto - cristi baluță

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

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

Respondido 28 ago 14, 15:08

Devuelve "Fecha no válida" en Safari - pmrotula

Reemplazar `UTC` con +0000 (noté que el espacio entre 00 y UTC debe eliminarse) y esto funcionará tanto en Firefox como en Chrome. Sin embargo, no estoy seguro de Safari (Referencia: stackoverflow.com/a/17545854/1273587) - cytsunny

Solución de una 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 la diferencia de zona horaria en minutos wrt. GMT (por ejemplo, India +5: 30 es 5 * 60 + 30 = 330 minutos)

Respondido el 29 de enero de 15 a las 09:01

Este sería un código que se ejecuta en el cliente, lo que significa que la zona horaria será diferente para los usuarios ubicados de manera diferente. Esta solución requeriría que todos los que la necesiten vivan en la misma zona horaria (la suya). - kevin beal

@Kevin Beal en ese caso solo usa getTimezoneOffset - maximus

// 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)

Respondido 25 Jul 18, 03:07

Explicar su código y cómo resuelve el problema mejorará la calidad de su respuesta y ayudará a los usuarios a aprender. - Nic3500

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

http://www.datejs.com/

Recibo 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á:

Lun 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/

El 'addMinutes' proviene de datejs, probablemente podrías hacer esto en js puro por tu cuenta, pero ya tenía datejs en mi proyecto, así que encontré una manera de usarlo para obtener las fechas correctas.

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

Respondido 05 Oct 16, 14:10

Probé todos los métodos y este fue el único en llegar a la medianoche, ¡que era lo que buscaba! - SharpC

Este código devolverá su Objeto de fecha formateado con el zona horaria del navegador.

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

Edit:

Para evitar contaminar la API de fecha, la función anterior se puede transformar en una función de utilidad. La función toma un objeto Date y devuelve un objeto Date mutado.

function setTimeZone(date) {
    date.setHours(date.getHours() + (new Date().getTimezoneOffset() / 60));
    return date;
}

Respondido el 11 de diciembre de 19 a las 16:12

No a la extensión de objetos nativos - Pablo Rumkin

cualquier kilometraje en

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

Respondido el 13 de enero de 09 a las 17:01

Esto parece funcionar para mí (una zona horaria de distancia de GMT), pero dado que la "configuración regional" no está necesariamente relacionada con la zona horaria, no confiaría en ella. - Wytzé

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>

contestado el 17 de mayo de 13 a las 18:05

Su ejemplo excluye el horario de verano. Hora actual: viernes 04 de octubre de 2013 11:13:43 GMT-0700 (hora de verano del Pacífico) Hora Utc: viernes 04 de octubre de 2013 18:13:43 GMT Banff, Canadá: 1213 hrs. Michigan: 1413 hrs. Greenwich, Inglaterra (UTC): 1913 hrs. Tokio, Japón: 0413 hrs. Berlín, Alemania: 2013 hrs. - jeson martajaya

GMT -03: 00 Ejemplo

new Date(new Date()-3600*1000*3).toISOString();  // 2020-02-27T15:03:26.261Z

O incluso

now  = new Date().getTime()-3600*1000*3; // 1582818380528
data = new Date(now).toISOString();      // 2020-02-27T15:03:26.261Z

Respondido 27 Feb 20, 18:02

Si desea verificar la diferencia de tiempo entre dos fechas, simplemente puede verificar si la segunda zona horaria es mayor o menor que la primera zona horaria deseada y restar o agregar una hora.

  const currTimezone = new Date().getTimezoneOffset(); // your timezone
  const newDateTimezone = date.getTimezoneOffset(); // date with unknown timezone

  if (currTimezone !== newDateTimezone) {
    // and below you are checking if difference should be - or +. It depends on if unknown timezone is lesser or greater than yours
    const newTimezone = (currTimezone - newDateTimezone) * (currTimezone > newDateTimezone ? 1 : -1);
    date.setTime(date.getTime() + (newTimezone * 60 * 1000));
  }

Respondido 23 Oct 19, 20:10

Estaba teniendo un problema similar con un selector de fechas. Mi investigación condujo a una solución muy simple, sin bibliotecas adicionales ni multiplicadores codificados.

Información clave:

  1. ISO es el estándar de fecha preferido de Javascript. Suponga que las utilidades de fecha probablemente devolverán valores de fecha en ese formato.
    • Mi selector de fechas muestra la fecha en un formato localizado: mm / dd / aaaa

    • Sin embargo, devuelve el valor de la fecha en formato ISO: aaaa-mm-dd

      //Select "08/12/2020" in Date Picker date_input 
      
      var input = $('#date_input').val();  //input: 2020-08-12
      
  1. Date.getTimezoneOffset () devuelve el desplazamiento en minutos.

Ejemplos:

Si usa el valor de fecha devuelto predeterminado sin modificar el formato de cadena, es posible que la Fecha no se establezca en su zona horaria. Esto puede dar lugar a resultados inesperados.

var input = $('#date_input').val();  //input: 2020-08-12
var date = new Date(input);          //This get interpreted as an ISO date, already in UTC
//date:                             Tue Aug 11 2020 20:00:00 GMT-0400 (Eastern Daylight Time)
//date.toUTCString():               Wed, 12 Aug 2020 00:00:00 GMT
//date.toLocaleDateString('en-US'):       8/11/2020

El uso de un formato de cadena de fecha diferente al estándar ISO aaaa-mm-dd aplica su zona horaria a la Fecha.

var date = new Date("08/12/2020");  //This gets interpreted as local timezone
//date:                             Wed Aug 12 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
//date.toUTCString():               Wed, 12 Aug 2020 04:00:00 GMT
//date.toLocaleDateString('en-US'):       8/12/2020

Solución:

Para aplicar su zona horaria a la fecha independiente del formato sin manipular cadenas, use Date.getTimezoneOffset() con Minutos. Esto funciona con el formato de cadena de fecha original (es decir, fechas UTC o fechas localizadas). Proporciona un resultado coherente que luego se puede convertir con precisión a UTC para su almacenamiento o interactuar con otro código.

var input = $('#date_input').val();
var date = new Date(input);
date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
//date:                             Wed Aug 12 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
//date.toUTCString():               Wed, 12 Aug 2020 04:00:00 GMT
//date.toLocaleDateString('en-US'):       8/12/2020
                

Respondido 18 ago 20, 09:08

Cuando creo un objeto de fecha:

new Date(year, month, day, hour, minute)

Trabajo bien en localhost. Cuando lo implemento en el servidor rompe, porque el servidor está en otra zona horaria.

No puedo usar getTimezoneOffset (). Necesito el Zona horaria Desplazamiento de mi casa - depende de verano/invierno

// add diff minutes between myself (HOME) and server 
timezoneHomeOffset (d, tz = 'Europe/Copenhagen') {
  const utc = new Date(d.getTime())
  const dHome = new Date(d.toLocaleString('en-US', { timeZone: tz }))
  const diff = Math.round((utc - dHome) / 60000) // 60*1000 => minutes
  d.setMinutes(d.getMinutes() + diff)
  return d
}

Respondido el 16 de diciembre de 20 a las 22:12

const date = new Date("2020-12-16 17:45:00 UTC");

Funciona bien.

Respondido el 16 de diciembre de 20 a las 22:12

Puede usar la biblioteca para ayudar a cambiar la zona horaria

moment-timezone

var moment = require("moment-timezone");
const today = new Date();
var timeGet = moment(today);
timeGet.tz("Asia/Karachi").format("ha z");`

esto puede cambiar la zona horaria de su región, pegue el área de su región y obtenga un problema real de gmt + resolve

Respondido el 21 de diciembre de 20 a las 07:12

¿Podría agregar una breve explicación y un enlace de referencia a la respuesta para la zona horaria del momento? - kim myeongkil

Esto funcionó para mí. Sin embargo, 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"

Respondido 04 Abr '18, 02:04

Usé 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());
},

Respondido 02 ago 19, 09:08

Esta es la MEJOR solución

Uso:

// 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

Respondido 24 Feb 17, 05:02

Vaya, tampoco me gusta, pero supongo que la gente realmente ¡Odio que anule el prototipo de incorporados! - Josh de Qaribou

@JoshfromQaribou No hay nada de malo en cambiar el prototipo =) esto es un mito y un error común. Estas personas simplemente piensan de una manera formulada y no aplican el pensamiento crítico. Se les dijo que esto es malo, ellos creen ciegamente en ello =) The Matrix está en todas partes ahah. - maxmaxmaximus

@JoshfromQaribou Es malo cambiar el prototipo SI está escribiendo una biblioteca. Si cambia el prototipo como PARTE de su proyecto, entonces no hay nada de malo en eso. Por ejemplo, si en el futuro los navegadores agregan un método con el mismo nombre, entonces simplemente lo anula =), y también significa que los paquetes ACTUALES que está usando, y su código, NO usan la propiedad recién agregada. Estos son los conceptos básicos de javascript, pero no todos los entienden =), el hecho es que soy un programador genio y hay una gran brecha entre mi experiencia y la experiencia de la gente común =) - maxmaxmaximus

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.