2

現在、このコードは明日と来月に機能します - 週末は機能しますが、月末に近づいているためエラーが発生しています。私の開始日は 8/31/12 に設定され、終了日は 8/34/12 です (Sql で DateTime に変換すると明らかにエラーがスローされます)。

day を追加し、 month を追加する計算は成功していますが、次の月に日を追加するとうまくいきません。これが起こっている理由を理解していると思います.dateを取得しています-「29」をintに変換してから追加します.12月の「来月」でも同じ問題が発生すると思います.

私の質問は、JavaScript の日付に日を追加する適切な方法 (または有効な方法) は何かということです。

        var d = new Date();
        var startdate;
        var enddate;

         if ($('._tomorrow').attr("checked") == "checked") {
                startdate = [d.getMonth() + 1, d.getDate() + 1, d.getFullYear()].join('/');
                enddate = [d.getMonth() + 1, d.getDate() + 2, d.getFullYear()].join('/');
            }
            if ($('._weekend').attr("checked") == "checked") {
                startdate = [d.getMonth() + 1, d.getDate() + 6 - d.getDay(), d.getFullYear()].join('/');
                enddate = [d.getMonth() + 1, ( d.getDate() + 6 - d.getDay()) + 2, d.getFullYear()].join('/');
            }
            if ($('._nextmonth').attr("checked") == "checked") {
                startdate = [d.getMonth() + 2, 1, d.getFullYear()].join('/');
                enddate = [d.getMonth() + 2, 29 , d.getFullYear()].join('/');
            }
4

2 に答える 2

2

調整された値を使用して新しい日付オブジェクトを作成する必要があります。今、あなたは単純にいくつかの乱数を取り、それらを増やしています。

31+3/8/2012 -> 34/8/2012, not 3/9/2012

最初に次のようにします。

d.setMonth(d.getMonth()+ 2)

内部的に、JS は、各期間の終わりに発生する「オーバーフロー」を考慮して日/月/年を適切に調整し、有効な日付を生成します。

于 2012-08-29T19:54:21.867 に答える
0

指定した日数を追加するには、新しいDateオブジェクトを作成してから、追加に必要な日数であるd.setDate(d.getDate() + n)where is を使用します。n

次に を呼び出すと、getYear()それらがすべて有効な値に「修正」されていることがわかります。getMonth()getDate()

> d = new Date()
Wed Aug 29 2012 20:57:12 GMT+0100 (BST)
> [d.getDate(), d.getMonth() + 1]
[29, 8]
> d.setDate(d.getDate() + 10);
1347134232993
> [d.getDate(), d.getMonth() + 1]
[8, 9]

次の月が現在の月よりも短い場合に何が起こるかを定義する必要があるため、月の追加はそれほど簡単ではありません。

ただし、翌月の開始日を計算するのは簡単です。

var now = new Date();
var start = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var end   = new Date(now.getFullYear(), now.getMonth(), now.getDate());

if ($('._tomorrow').is(':checked')) {
    start.setDate(now.getDate() + 1);
      end.setDate(now.getDate() + 2);
} else if ($('._weekend').is(':checked')) {
    start.setDate(now.getDate() + 6 - now.getDay());
      end.setDate(now.getDate() + 8 - now.getDay());
} else if ($('._nextmonth').is(':checked')) {
    start.setDate(1);
      end.setDate(1);
    start.setMonth(now.getMonth() + 1);
      end.setMonth(now.getMonth() + 2);
}

var startStr = [start.getMonth() + 1, start.getDate(), start.getFullYear()].join('/');
var endStr = [end.getMonth() + 1, end.getDate(), end.getFullYear()].join('/');

http://jsfiddle.net/alnitak/nTSMg/を参照してください

于 2012-08-29T19:54:41.950 に答える