web-dev-qa-db-fra.com

Moment.js - Comment détecter l’heure avancée et ajouter un jour

J'ai besoin de créer des objets Date à partir de chaînes de données Date pour chaque heure de chaque jour depuis l'année 2000. 

Les chaînes ressemblent à ceci pour chaque heure, dans un format Month/Day/Year Hour ...

"04/02/2000 01", "04/02/2000 02", "04/02/2000 03" ...all the way to... "04/02/2000 24"

Maintenant, j'ai le code suivant, qui fonctionne très bien sauf les jours avec l'heure avancée ...

  // Split At Space
var splitDate = "04/02/2000 24".split(/[ ]+/);
var hour = splitDate[1];
var day  = splitDate[0];
  // Split At Slashes
var dayArray = day.split("/");
if (hour === "24") {
       // Months are zero-based, so subtract 1 from the month
     date = new Date(Date.UTC( dayArray[2], parseInt(dayArray[0] - 1), dayArray[1], 0, 0, 0 ));
     date.setDate(date.getDate() + 1);
} else {
     // Months and Hours are zero-based, so subtract 1 from each
     date = new Date(Date.UTC( dayArray[2], parseInt(dayArray[0] - 1), dayArray[1], hour, 0, 0 ));
};

Les jours avec l'heure d'été, comme 04/02/2000, l'ajout d'un jour ne fonctionne pas si l'heure est 24. Au lieu de cela, il renvoie simplement Sun, 02 Apr 2000 23:00:00 GMT

Avec Moment.js, est-il possible de détecter un jour d'heure d'été et de faire fonctionner ce code correctement?

20
ac360

Pour détecter DST, utilisez la méthode .isDST(): http://momentjs.com/docs/#/query/is-daylight-saving-time/

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

En utilisant ce test, vous devriez être capable de déterminer comment modifier le comportement de votre programme en conséquence.

34
adamb

Voici comment j'ai fait un petit vérificateur:

var curDst = dtdate.isDST()
var prevDst = moment(dtdate).clone().subtract(1, "day").isDST();
var nextDst = moment(dtdate).clone().add(1, "day").isDST();
var isDstChangeDate = (curDst !== nextDst) === true || (curDst === prevDst) !== true;
0
red