<p>moment.utc (cadena) analiza ISO8601 como hora local cuando falta la zona horaria</p>

Creado en 12 abr. 2012  ·  24Comentarios  ·  Fuente: moment/moment

Comentario más útil

Debo agregar a la expresión de confusión en torno a la funcionalidad UTC. La expectativa más intuitiva de moment.utc () sería que devolvería un objeto Moment que representa la fecha / hora actual en hora UTC. Pero de acuerdo con esta discusión, no es el caso y simplemente establece la bandera. Todavía no está claro qué hace esa bandera. Nada de esto se menciona en la documentación, lo que lo hace lamentablemente inadecuado. Agregue una aclaración de este tema con ejemplos a su trabajo pendiente. Gracias.

Todos 24 comentarios

moment.utc (cadena) analiza ISO8601 como hora local cuando falta la zona horaria

así es como dice ISO8601 ... y EcmaScript 6

Creo que se aplica a moment(string) bastante bien, pero cuando se usa moment.utc(string) , creo que la implicación es que quieres que se analice como UTC.

moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time

Tengo un problema, creo que relacionado con esto:

Estoy tratando de convertir esta fecha: 12-04-2012 (DD-MM-YYYY, en UTC) a su marca de tiempo Unix.
Estoy haciendo esto:

var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );

Esto genera una marca de tiempo incorrecta: 1334670827391 .
Si intento:

console.log( mm.format('DD-MM-YYYY') );

Se supera: 17-04-2012

a538306 corrige esto. Saldrá en 1.6.0

Sigo viendo este problema en la última versión ...

Estoy pasando en: moment.utc ('2012-12-14T00: 29: 40.276Z') y obtengo: {_d: Thu Dec 13 2012 18:29:40 GMT-0600 (hora estándar central), _isUTC: true (Jue 13 de diciembre de 2012 18:29:40 GMT-0600 (hora estándar central)) .. No está usando la hora utc sino mi zona horaria local.

Esto es lo que obtengo con 1.7.2 .

moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"

Esto es lo que me sucede (última versión) cuando escribo en la consola en Chrome:

console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'));
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). formato ());
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). toDate ());

H {_d: jueves 13 de diciembre de 2012 18:29:40 GMT-0600 (hora estándar central), _isUTC: true, _a: Array [8], _lang: false, clone: ​​function…}

2012-12-14T00: 29: 40 + 00: 00

Jue 13 de diciembre de 2012 18:29:40 GMT-0600 (hora estándar central)

¿No debería crear una nueva fecha en utc (sin zona horaria)? Además, el primer console.log muestra el objeto de momento con una zona horaria cst y no la hora utc.

Thu Dec 13 2012 18:29:40 GMT-0600 es en realidad exactamente el mismo tiempo que 2012-12-14T00:29:40.276Z . Son solo diferentes formas de mostrar el mismo tiempo. Si lo desea, puede ver esto haciendo lo siguiente.

console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toString());
// Thu Dec 13 2012 16:29:40 GMT-0800 (PST)
console.log(moment.utc('2012-12-14T00:29:40.276Z').toDate().toUTCString());
// Fri, 14 Dec 2012 00:29:40 GMT

El JS nativo Date no tiene un modo utc vs local, solo tiene accesos como getUTCHours y getHours .

Moment.js abstrae estos métodos getUTC* vs get* con la idea del modo utc y el modo local. Si el momento está en modo utc, usa los métodos getUTC* . Si está en modo local, usa los métodos get* .

Gracias por la aclaración.

Estaba esperando y pensé que sinze el estándar iso establece que Z significa que no hay zona horaria en la que se usaría de forma predeterminada en utc. Entonces, si hiciste moment.utc ('2012-12-14T00: 29: 40.276Z') o moment ('2012-12-14T00: 29: 40.276Z'), ambos se tratarían como utc y la bandera utc sería establecido en verdadero.

PD, perdón por molestarte tanto:. Estoy creando una nueva discusión para una pregunta diferente: s

No hay problema.

La razón por la que no configuramos la bandera isUTC con moment() y moment.utc() es porque aunque esté analizando una cadena UTC + 0, es posible que desee mostrar la momento en la zona horaria de los usuarios.

Este es un caso de uso bastante común, ya que es una buena práctica almacenar los tiempos como cadenas ISO8601 UTC + 0 en el backend y mostrarlos en el frontend en la zona horaria del usuario.

Gracias, espero que alguien más encuentre útil esta discusión también.

Cuando ejecuto console.log (moment.utc ()), informa "Viernes 18 de enero de 2013 16:25:32 GMT-0800 (UTC)" Sin embargo, esa es la hora local del Pacífico, NO la hora UTC actual. Dado que explícitamente dice (UTC) cuando lo registro, supongo que cree que "16:25:32" está en hora UTC, pero de hecho es hora local del Pacífico ...

Además, supongo que moment.utc (). ValueOf () está devolviendo el número de milisegundos en UTC desde epoch, que parece ser incorrecto. ¿Has visto algo de este comportamiento?

console.log (momento ())
H {_d: viernes 18 de enero de 2013 16:51:20 GMT-0800 (UTC), _isUTC: falso, _a: nulo, _lang: falso}
console.log (moment.utc ())
H {_d: viernes 18 de enero de 2013 16:51:20 GMT-0800 (UTC), _isUTC: true, _a: null, _lang: false}

Parecería que todo lo que está haciendo es voltear la bandera _isUTC. : P Parece que está devolviendo la hora local independientemente de si especifico o no .utc ().

Sí, .utc y .local simplemente cambian la bandera .isUTC que se usa en todos los getters y setters.

Debido a que el Date.toString nativo se muestra en la hora local, está viendo la misma representación en ambos casos.

Sin embargo, .format usa la bandera .isUTC , por lo que formatear un momento con la bandera isUTC establecida en verdadero formateará como se esperaba.

Vea las diferencias a continuación con respecto a Date.prototype.toString , Date.prototype.toUTCString y moment.fn.format .

moment().toDate().toString();     // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment.utc().toDate().toString(); // "Wed Jan 23 2013 09:48:54 GMT-0800 (PST)"
moment().toDate().toUTCString();     // "Wed, 23 Jan 2013 17:48:54 GMT"
moment.utc().toDate().toUTCString(); // "Wed, 23 Jan 2013 17:48:54 GMT"
moment().format();     // "2013-01-23T09:48:54-08:00"
moment.utc().format(); // "2013-01-23T17:48:54+00:00"

El mismo problema aqui:
moment (). valueOf () y moment (). utc (). valueOf ()
devuelve el mismo valor! :decepcionado:

Entonces, para obtener los milisegundos utc, necesito:

moment().valueOf() - (moment().utcOffset() * 60 * 1000)

@rubenspgcavalcante - No estoy seguro de lo que estás preguntando. Se supone que esos dos devuelven el mismo valor, ambos en milisegundos desde la época de Unix.

El fragmento que escribió en realidad devuelve un momento diferente en el tiempo.

Tengo un problema similar en el que la bandera UTC se establece en verdadero pero cuando califico format (); Devuelve la hora local. Aquí hay una captura de pantalla.

screen shot 2016-07-10 at 8 50 15 am

La línea después del objeto es un console.log de la var después de que llamo a format (); en eso.

¿Estoy haciendo algo mal?

@ james-hoegerl, parece que el objeto de fecha interno es el 5 de julio de 2016 a las 19:00 hora central. Agregue cinco horas a eso para llegar a UTC, y es el 6 de julio, que es lo que parece estar registrando, así que en resumen, no veo nada malo.
Parece que estás usando el calendario completo. Hace algún parche de extensión / mono de momento que puede causar un comportamiento inusual.

Ok, tal vez solo estoy confundido acerca de uct. Pensé que obtendría "2016-05-07 07:00:00", luego podría almacenar eso en la base de datos y luego obtener la hora local para cada computadora de usuario final a través del momento.

Entonces, en primer lugar, asumiré que se refería a 6016-07-05 (5 de julio, no 7 de mayo). Tu hora local es el 5 de julio a las 19:00. Ajustado para la luz del día central de EE. UU., Agregamos cinco horas. Eso produce el 6 de julio a la medianoche.

Si quiere obtener el 5 de julio, creo que lo que realmente quiere es la hora local, no UTC. Podría llamar a .local () en el momento para volver a la hora local.

Puede encontrar esto útil: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/

Muchas gracias por tu ayuda @maggiepint. Sí, mi comentario anterior quise decir 7-5. Lo siento, escribí ese comentario apresuradamente en mi teléfono junto a la piscina este fin de semana. Veo dónde ha estado mi pensamiento al revés ahora. fullcalendar funciona en todos los objetos de momento ambiguos con zonas de tiempo, así que creo que solo estaba teniendo un malentendido y necesito hacer algunos cambios al respecto. Gracias de nuevo por tu tiempo @maggiepint

Hola, Para convertir UTC a la hora del usuario, necesitamos proporcionar formato.
por ejemplo: sea utcTime = moment ({hora: 10, minuto: 20) .format ('YYYY-MM-DD HH: mm: ss');
let stillUtc = moment.utc (utcTime) .toDate ();
let localTime = moment (stillUtc) .local ();
Ahora puedo obtener localTIme. Pero si elimino el formato, todavía puedo formato UTC. aquí 10:20 es la zona horaria UTC que proviene del backend. Quiero mostrar esto al usuario en la zona horaria del usuario.

Por favor, ayúdame.

El mismo problema aqui:
moment (). valueOf () y moment (). utc (). valueOf ()
devuelve el mismo valor! 😞
Entonces, para obtener los milisegundos utc, necesito:
moment (). valueOf () - (moment (). utcOffset () * 60 * 1000)

@rubenspgcavalcante - No estoy seguro de lo que estás preguntando. Se supone que esos dos devuelven el mismo valor, ambos en milisegundos desde la época de Unix.

@ mj1856 No entiendo cómo se

Debo agregar a la expresión de confusión en torno a la funcionalidad UTC. La expectativa más intuitiva de moment.utc () sería que devolvería un objeto Moment que representa la fecha / hora actual en hora UTC. Pero de acuerdo con esta discusión, no es el caso y simplemente establece la bandera. Todavía no está claro qué hace esa bandera. Nada de esto se menciona en la documentación, lo que lo hace lamentablemente inadecuado. Agregue una aclaración de este tema con ejemplos a su trabajo pendiente. Gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones