ある期間を、月ごとに区切る
JavaScriptで、ある期間を、月ごとに期間で区切ってくれるものを作りました。
テストコード (QUnit)
test("月ごとの期間配列作成テスト。 2012/02/15 〜 2012/04/16 の場合", function () { expect(10); var startDate = new Date(2012, 2 - 1, 15); var endDate = new Date(2012, 4 - 1, 16); var span = $.dateHelper.getSpan(startDate, endDate); //実行 var spans = $.dateHelper.createSpansByMonth(startDate, span); equal(3, spans.length); equal(15, spans[0].span()); equal(31, spans[1].span()); equal(16, spans[2].span()); equal(new Date(2012, 2 - 1, 15).toString(), spans[0].startDate().toString()); equal(new Date(2012, 2 - 1, 29).toString(), spans[0].endDate().toString()); equal(new Date(2012, 3 - 1, 1).toString(), spans[1].startDate().toString()); equal(new Date(2012, 3 - 1, 31).toString(), spans[1].endDate().toString()); equal(new Date(2012, 4 - 1, 1).toString(), spans[2].startDate().toString()); equal(new Date(2012, 4 - 1, 16).toString(), spans[2].endDate().toString()); });
実装コード
function createSpansByMonth(startDate, span) {
//開始日と日数より、月毎に区切った期間の配列を返します。
var results = [];
var currentDate = startDate;
var endDate = getEndDate(startDate, span);
while (currentDate.getTime() <= endDate.getTime()) {
var currentMonthLastDate = getMonthLastDay(currentDate); //現在の月の最後の日
if (endDate.getTime() < currentMonthLastDate.getTime()) {
currentMonthLastDate = endDate;
}
results.push(daySpanFrom(currentDate, currentMonthLastDate));
currentDate = new Date(currentMonthLastDate.getTime() + 86400000);
}
return results;
}
利用モデル
function DaySpan(startDate, span) {
//期間を表すオブジェクト startDate:開始日, span:日数
var _startDate = startDate;
var _span = span;
this.startDate = function () {
return _startDate;
}
this.endDate = function () {
return getEndDate(_startDate, _span);
}
this.span = function () {
return _span;
}
}
ヘルパー(exDate利用)
function getMonthLastDay(date) {
//date オブジェクトの保持する月の最終日を Date オブジェクト形式で返します。
var $date = $.exDate(toShortString(date));
return new Date($date.lastDay().getTime());
}
function getEndDate(startDate, span) {
//開始日と日数より、終了日を取得します
var result = new Date();
result.setTime(startDate.getTime() + 86400000 * (span - 1));
return result;
}
以上。
date.getTime() < date.Time() や、86400000 などが微妙ですが、
すぐに書ける処理なので書いちゃうという…