web-dev-qa-db-ja.com

Moment.js-夏時間を検出して1日を追加する方法

2000年以降、毎日1時間ごとに日付データの文字列から日付オブジェクトを作成する必要があります。

文字列は_Month/Day/Year Hour_形式で毎時間このように見えます...

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

今、私は次のコードを持っていますが、夏時間のある日を除いて正常に動作します...

_  // 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 ));
};
_

夏時間のある日では、_04/02/2000_のように、時間が_24_の場合、日を追加することはできません。代わりに、単に_Sun, 02 Apr 2000 23:00:00 GMT_を返します

Moment.jsを使用すると、DSTの日を検出し、このコードを正しく動作させることができますか?

24
ac360

DSTを検出するには、.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

このテストを使用すると、それに応じてプログラムの動作を変更する方法を決定できるはずです。

40
adamb

これが小さなチェッカーの作成方法です。

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