web-dev-qa-db-fra.com

Définissez la date () sur minuit dans le fuseau horaire de l'utilisateur avec moment.js

J'utilise moment.js pour afficher une date UTC dans le fuseau horaire local de l'utilisateur:

var date = new Date(Date.UTC(2016,03,30,0,0,0));
var now = new Date();
var diff = (date.getTime()/1000) - (now.getTime()/1000);

var textnode = document.createTextNode(moment(date).format('dddd, DD.MM.YYYY') + ' a las ' + moment(date).format('HH:mm A'));
document.getElementsByClassName("date")[0].appendChild(textnode.cloneNode(true));

J'utilise plus tard la variable diff pour afficher un compte à rebours.

Je voudrais montrer un compte à rebours différent à tout le monde dans leur fuseau horaire local. (Utilisation de la différence jusqu'à minuit dans leur fuseau horaire, pas en UTC)

Mais j'ai du mal à le faire fonctionner. Au lieu d’utiliser var date = new Date(Date.UTC(2016,03,30,0,0,0));, j’ai probablement besoin d’utiliser une fonction de moment.js qui me laisse jusqu’à minuit dans le fuseau horaire des utilisateurs.

Le meilleur exemple serait le jour de l'an. Si j'utilise UTC, tout le monde aura le même compteur (il reste 9 heures) mais cela n'aurait aucun sens dans différentes parties du monde. Il devrait rester 2 heures en Australie et 14 heures aux États-Unis.

7
Snowball

Je ne suis pas sûr de bien comprendre votre question, mais je vais vous donner quelques conseils généraux.

  1. Lors de l'utilisation de moment.js, il n'est guère nécessaire d'utiliser l'objet Date. Utilisez-le uniquement pour interagir avec d'autres API qui attendent un objet Date.

  2. Pour obtenir un moment en UTC, utilisez simplement moment.utc(...) en transmettant les arguments appropriés, tels que moment.utc([2016,3,30]) ou moment.utc('2016-04-30') pour minuit le 30 avril UTC.

  3. Si vous souhaitez reconvertir cela en heure locale de l'utilisateur, utilisez la fonction .local(). Par exemple, moment.utc('2016-04-30').local() créera un moment avec l'heure locale équivalente à l'heure UTC fournie.

  4. Si vous souhaitez que l'heure de l'utilisateur soit à l'heure locale, il s'agira alors de moment(...), telle que moment([2016,3,30]) ou moment('2016-04-30') pour le 30 avril à minuit local heure.

  5. Vous pouvez différencier deux moments en utilisant la fonction diff, qui peut donner la réponse en unités spécifiques, telles que m1.diff(m2, 'seconds')m1 et m2 sont des objets de moment.

  6. Vous n'avez pas besoin d'appeler format deux fois. Encapsulez simplement le texte de votre choix avec des crochets. .format('dddd, DD.MM.YYYY [a las] HH:mm A')

  7. Vous pouvez regarder dans le support local de moment. Si je ne me trompe pas, "a las" indique l'espagnol, mais ce n'est pas toujours "a las", mais parfois "a la", si l'heure est 1. En outre, moment utilise uniquement ces mots dans sa fonction .calendar(), par exemple lors de la production d'une phrase telle que "mañana a las 13:17". Une date ordinaire formatée avec .format('LLLL') dans les paramètres régionaux espagnols serait quelque chose comme: "sábado, 19 de marzo de 2016 13:17". Donc, vous voudrez peut-être vérifier que "a las" est exactement ce que vous voulez dans tous les cas.

  8. Le titre de cette question était comment définir une date à minuit. Pour cela, je vous recommande d'utiliser la fonction startOf de moment. m.startOf('day') donnera le moment m au début de la journée, qui est généralement minuit. N'oubliez pas que chaque jour local ne commence pas à minuit dans chaque fuseau horaire. En raison d’anomalies telles que heure d’été , certains jours peuvent commencer à 13h00. Par exemple, cela se produit au Brésil le 16 octobre cette année.

    De même, si vous avez créé le moment en mode UTC, vous souhaiterez peut-être le reconvertir d'abord en mode local avant de le définir au début de la journée. Si vous ne voulez pas changer l'objet moment original, assurez-vous de le cloner en premier.

    Mettre tout cela ensemble:

    var m1 = moment.utc([2016,3,30]);
    var m2 = m1.clone().local().startOf('day');
    
    var now = moment();
    var diff = m1.diff(now, 'seconds');
    
23
Matt Johnson

Donc, la réponse est assez simple (désolé, ne pas essayer de vous faire sentir stupide;))

var date = new Date(Date.UTC(2016,03,30,0,0,0));
var localDate = new Date(2016,03,30,0,0);
var now = new Date();
var diff = (localDate.getTime()/1000) - (now.getTime()/1000);

var textnode = document.createTextNode(moment(date).format('dddd, DD.MM.YYYY') + ' a las ' + moment(date).format('HH:mm A'));
document.getElementsByClassName("date")[0].appendChild(textnode.cloneNode(true));

L'utilisation du constructeur par défaut pour un objet Date vous donne un objet date/heure local en JavaScript.

0
CodingGorilla