Ich muss Datumsobjekte aus Datumsdaten-Strings für jede Stunde eines jeden Tages seit dem Jahr 2000 erstellen.
Die Zeichenfolgen sehen für jede Stunde so aus, im Month/Day/Year Hour
-Format ...
"04/02/2000 01", "04/02/2000 02", "04/02/2000 03" ...all the way to... "04/02/2000 24"
Nun habe ich den folgenden Code, der gut funktioniert, außer an Tagen mit Sommerzeit ...
// 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 ));
};
An Tagen mit Sommerzeit funktioniert das Hinzufügen eines Tages wie 04/02/2000
nicht, wenn die Stunde 24
ist. Stattdessen wird nur Sun, 02 Apr 2000 23:00:00 GMT
zurückgegeben.
Ist es mit Moment.js möglich, einen DST-Tag zu erkennen, damit dieser Code korrekt funktioniert?
Verwenden Sie zum Ermitteln der Sommerzeit die .isDST()
-Methode: 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
Mit diesem Test sollten Sie in der Lage sein, das Verhalten Ihres Programms entsprechend zu ändern.
So habe ich einen kleinen Checker gemacht:
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;