Voir ce commentaire: https://github.com/timrwood/moment/issues/272#issuecomment -5095486
moment.utc (string) analyse ISO8601 comme heure locale lorsque le fuseau horaire est manquant
c'est ainsi que dit ISO8601 ... et EcmaScript 6
Je pense que cela s'applique assez bien à moment(string)
, mais lorsque vous utilisez moment.utc(string)
, je pense que l'implication est que vous voulez qu'il soit analysé en UTC.
moment('2010-10-20T08:40'); // should parse to local time
moment.utc('2010-10-20T08:40'); // should parse to utc time
J'ai un problème, je pense lié à ceci:
J'essaye de convertir cette date: 12-04-2012 (JJ-MM-AAAA, en UTC) en son horodatage Unix.
Je fais ça:
var date = '12-04-2012';
var mm = moment().utc( date, "DD-MM-YYYY" );
console.log( mm.valueOf() );
Cela génère un horodatage incorrect: 1334670827391
.
Si j'essaye:
console.log( mm.format('DD-MM-YYYY') );
It outpus: 17-04-2012
a538306 corrige ce problème. Sortira dans 1.6.0
Je vois toujours ce problème dans la dernière version.
Je passe: moment.utc ('2012-12-14T00: 29: 40.276Z') et j'obtiens: {_d: Thu Dec 13 2012 18:29:40 GMT-0600 (Central Standard Time), _isUTC: true (Thu Dec 13 2012 18:29:40 GMT-0600 (Central Standard Time)) .. Il n'utilise pas l'heure UTC mais mon fuseau horaire local.
C'est ce que j'obtiens avec 1.7.2
.
moment.utc('2012-12-14T00:29:40.276Z').format(); // "2012-12-14T00:29:40+00:00"
Voici ce qui se passe pour moi (dernière version) lorsque j'écris sur la console en chrome:
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'));
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). format ());
console.log (moment.utc ('2012-12-14T00: 29: 40.276Z'). toDate ());
H {_d: Thu Dec 13 2012 18:29:40 GMT-0600 (Central Standard Time), _isUTC: true, _a: Array [8], _lang: false, clone: function…}
2012-12-14T00: 29: 40 + 00: 00
Jeu 13 décembre 2012 18:29:40 GMT-0600 (heure normale du Centre)
Ne devrait-il pas créer une nouvelle date dans utc (sans fuseau horaire)? De plus, le premier console.log montre l'objet moment avec un fuseau horaire cst et non son heure utc.
Thu Dec 13 2012 18:29:40 GMT-0600
est en fait exactement la même heure que 2012-12-14T00:29:40.276Z
. Ce ne sont que des façons différentes d'afficher la même heure. Si vous le souhaitez, vous pouvez le voir en procédant comme suit.
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
Le JS Date
n'a pas de mode utc vs local, il a juste des accesseurs comme getUTCHours
et getHours
.
Moment.js résume ces méthodes getUTC*
vs get*
avec l'idée du mode utc et du mode local. Si le moment est en mode utc, il utilise les méthodes getUTC*
. S'il est en mode local, il utilise les méthodes get*
.
Merci pour la clarification.
Je m'attendais et je pensais que sinze la norme iso stipule que Z signifie pas de fuseau horaire qu'il serait par défaut utc. Donc, si vous avez fait moment.utc ('2012-12-14T00: 29: 40.276Z') ou moment ('2012-12-14T00: 29: 40.276Z'), les deux seraient traités comme utc et l'indicateur utc serait mis à vrai.
PS, désolé de vous déranger tant:. Je crée une nouvelle discussion pour une question différente: s
Aucun problème.
La raison pour laquelle nous ne définissons pas l'indicateur isUTC
avec à la fois moment()
et moment.utc()
est que même si vous analysez une chaîne UTC + 0, vous pouvez afficher le moment dans le fuseau horaire des utilisateurs.
C'est un cas d'utilisation assez courant, car c'est une bonne pratique de stocker les heures sous forme de chaînes ISO8601 UTC + 0 sur le backend et de les afficher sur le frontend dans le fuseau horaire de l'utilisateur.
Merci, j'espère que quelqu'un d'autre trouvera cette discussion utile aussi.
Lorsque j'exécute console.log (moment.utc ()), il signale "Ven 18 janvier 2013 16:25:32 GMT-0800 (UTC)" Cependant, c'est l'heure locale du Pacifique, PAS l'heure UTC actuelle. Puisqu'il dit explicitement (UTC) quand je l'enregistre, je suppose qu'il pense que "16:25:32" est en heure UTC, mais c'est en effet l'heure du Pacifique locale ...
De plus, je suppose que moment.utc (). ValueOf () renvoie le nombre de millisecondes en UTC depuis l'époque, ce qui semble être incorrect. Avez-vous vu l'un de ces comportements?
console.log (moment ())
H {_d: Ven 18 janvier 2013 16:51:20 GMT-0800 (UTC), _isUTC: false, _a: null, _lang: false}
console.log (moment.utc ())
H {_d: Ven 18 janvier 2013 16:51:20 GMT-0800 (UTC), _isUTC: true, _a: null, _lang: false}
Il semblerait que tout ce qu'il fait est de retourner l'indicateur _isUTC. : P Il semble renvoyer l'heure locale, que je spécifie ou non .utc ().
Oui, .utc
et .local
retournent simplement le drapeau .isUTC
qui est utilisé dans tous les getters et setters.
Étant donné que le Date.toString
natif est affiché à l'heure locale, vous voyez la même représentation dans les deux instances.
Cependant, .format
utilise l'indicateur .isUTC
, donc le formatage d'un moment avec l'indicateur isUTC
défini sur true sera formaté comme prévu.
Voir les différences ci-dessous concernant Date.prototype.toString
, Date.prototype.toUTCString
et 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"
Même problème ici:
moment (). valueOf () et moment (). utc (). valueOf ()
renvoie la même valeur! :désappointé:
Donc, pour obtenir les millisecondes utc, j'ai besoin de:
moment().valueOf() - (moment().utcOffset() * 60 * 1000)
@rubenspgcavalcante - Je ne suis pas sûr de ce que vous demandez. Ces deux sont supposés renvoyer la même valeur, toutes deux exprimées en millisecondes depuis l'époque Unix.
L'extrait que vous avez écrit renvoie en fait un moment différent dans le temps.
J'ai un problème similaire où l'indicateur UTC est défini sur true mais lorsque je calque format (); Il renvoie l'heure locale. Voici une capture d'écran.
La ligne après l'objet est un console.log du var après que j'appelle format (); dessus.
Est-ce que je fais quelque chose de mal?
@ james-hoegerl il semble que l'objet de date interne soit le 5 juillet 2016 à 19h00 (heure centrale). Ajoutez cinq heures à cela pour arriver à UTC, et c'est le 6 juillet, ce qui semble être la journalisation, donc en bref, je ne vois rien de mal.
Il semble que vous utilisiez fullcalendar. Il effectue des corrections d'extension / singe de moment qui peuvent provoquer un comportement inhabituel.
Ok peut-être que je suis juste confus à propos de uct. Je pensais que j'obtiendrais "2016-05-07 07:00:00", puis je pourrais le stocker dans la base de données, puis obtenir l'heure locale de chaque ordinateur utilisateur final via le moment.
Donc, tout d'abord, je suppose que vous vouliez dire 6016-07-05 (5 juillet, pas 7 mai). Votre heure locale est le 5 juillet à 19h00. Ajusté pour la lumière du jour centrale des États-Unis, nous ajoutons cinq heures. Cela donne le 6 juillet à minuit.
Si vous voulez obtenir le 5 juillet, je pense que ce que vous voulez vraiment, c'est l'heure locale, pas UTC. Vous pouvez appeler .local () sur le moment pour le ramener à l'heure locale.
Vous pouvez trouver cela utile: https://maggiepint.com/2016/05/14/moment-js-shows-the-wrong-date/
Merci beaucoup pour votre aide @maggiepint. Oui mon commentaire précédent je voulais dire 7-5. Désolé, j'ai écrit ce commentaire à la hâte sur mon téléphone au bord de la piscine ce week-end. Je vois où ma pensée a été en arrière maintenant. fullcalendar fonctionne sur tous les objets de moment à zones temporelles ambiguës, donc je pense que j'avais juste un malentendu là-dessus et que je devais faire un peu de réflexion à ce sujet. Merci encore pour votre temps @maggiepint
Bonjour, Pour convertir UTC en temps utilisateur, devons-nous fournir un format.
par exemple: let utcTime = moment ({heure: 10, minute: 20) .format ('AAAA-MM-JJ HH: mm: ss');
let stillUtc = moment.utc (utcTime) .toDate ();
let localTime = moment (stillUtc) .local ();
Maintenant, je peux obtenir localTIme. Mais si je supprime le format, je peux toujours le format UTC. ici 10:20 est l'heure UTC qui provient du backend. Je veux montrer cela à l'utilisateur dans le fuseau horaire de l'utilisateur.
Aidez-moi, s'il vous plaît.
Même problème ici:
moment (). valueOf () et moment (). utc (). valueOf ()
renvoie la même valeur! 😞
Donc, pour obtenir les millisecondes utc, j'ai besoin de:
moment (). valueOf () - (moment (). utcOffset () * 60 * 1000)
@rubenspgcavalcante - Je ne suis pas sûr de ce que vous demandez. Ces deux sont censés renvoyer la même valeur, toutes deux exprimées en millisecondes depuis l'époque Unix.
@ mj1856 Je ne comprends pas comment moment (). valueOf () et moment (). utc (). valueOf () sont censés renvoyer la même valeur ??
Je dois ajouter à l'expression de confusion autour de la fonctionnalité UTC. L'attente la plus intuitive de moment.utc () serait qu'elle renvoie un objet Moment représentant la date / heure actuelle en heure UTC. Mais selon cette discussion, ce n'est pas le cas et cela ne fait que définir le drapeau. On ne sait toujours pas ce que fait ce drapeau. Rien de tout cela n'est mentionné dans la documentation, ce qui la rend terriblement inadéquate. Veuillez ajouter des précisions sur ce sujet avec des exemples à votre backlog. Je vous remercie.
Commentaire le plus utile
Je dois ajouter à l'expression de confusion autour de la fonctionnalité UTC. L'attente la plus intuitive de moment.utc () serait qu'elle renvoie un objet Moment représentant la date / heure actuelle en heure UTC. Mais selon cette discussion, ce n'est pas le cas et cela ne fait que définir le drapeau. On ne sait toujours pas ce que fait ce drapeau. Rien de tout cela n'est mentionné dans la documentation, ce qui la rend terriblement inadéquate. Veuillez ajouter des précisions sur ce sujet avec des exemples à votre backlog. Je vous remercie.