月末近くの日付でsetMonth()を使うとバグる?

例えば5/31に、現在のDateから日付を作ると発生する模様。

現在の日時:2012/5/31

    // 年月を設定(1日)
    nDate.setFullYear(nYear);//2012
    nDate.setMonth(nMonth-1);//6-1
    nDate.setDate(1);
    // 月初の曜日を取得
    nFirstDay = nDate.getDay();

この場合getMonthをすると6月なので5が帰ってくるのが正解なのに6(7月)が帰ってくる。なんでやねん。

バグ?バグ?と思ったけど、バグではない。よく考えてみれば分かることだが…

現在の日時:2012/5/31

    // 年月を設定(1日)
    nDate.setFullYear(nYear);//2012
//この時点でのnDate:2012/5/31

    nDate.setMonth(nMonth-1);//6-1
//この時点でのnDate:2012/6/31→繰り上がって2012/7/1

    nDate.setDate(1);
//この時点でのnDate:2012/7/1

    // 月初の曜日を取得
    nFirstDay = nDate.getDay();

つまり最初のDayに31日が入っているので、月を代入したとき繰り上がってしまうということだ。
回避方法は、最初にDayを1日にしておけばいい

現在の日時:2012/5/31

    // 年月を設定(1日)
    nDate.setDate(1);
    nDate.setFullYear(nYear);//2012
    nDate.setMonth(nMonth-1);//6-1

    // 月初の曜日を取得
    nFirstDay = nDate.getDay();