Biz/Browser Tips001 月末、月初の求め方 (gooブログBackup)

【月末、月初の求め方について】
Bizの宝箱
http://support.axissoft.co.jp/support/webpages/index.html
には、いろんなサンプルコードがある。
[Bizの宝箱:月末、月初を求めるサンプルコード]

var month_first_date;
var month_last_date;

/* 月の初日の取得 */
month_first_date = new Date().setDate(1);

/* 月の末日の取得 */
month_last_date = new Date(month_first_date);
month_last_date.setFullYear(month_last_date.getFullYear()
+ int ( ( month_last_date.getMonth() + 1 ) / 12)); /* 年の設定 */
month_last_date.setMonth((month_last_date.getMonth() + 1) % 12); /* 月の設定 */
month_last_date.value -= 1; /* 1日引く */

print("月の初日:"+str(month_first_date,"YYYY/MM/DD"),"n");
print("月の末日:"+str(month_last_date,"YYYY/MM/DD"),"n");

値が求められるので、これはこれで正しいと思う。
が、例えば次に述べるコードのような計算でも求められる。
[CV.net風:月末、月初を求めるサンプルコード]

var date1 = new Date;
date1.value = rounddown(sysdate());
date1.value = date1.value -day(date1);/* 先月末 */
DebugMessage("先月末",date1,"n");
var m_first = new Date;
m_first.value = date1.value + 1; /* 月初 */
DebugMessage("月初",m_first,"n");
var m_last = new Date;
m_last.value = date1.value + 40-day(date1.value + 40); /* 今月末 */
DebugMessage("月末",m_last,"n");

Bizの宝箱のやり方だと、なんか年と月を数値的にバラバラに扱い、最後に月末を求めるところだけ日付型計算をしているのでしっくりこない
個人的には全部日付型で扱っちゃえば楽だろうと思うのだが...
多分、Date型はBizにおいては計算に用いるのにやっかいな型であるから、Bizの宝箱ではあのようなコードになっているのであろう。
なぜなら、var変数にてDate型を使うと、.valueを必ずつけないと途中で数値型に暗黙的に変換されてしまう
また、sysdate()というのも特別な関数で、
var date1 = sysdate();
date1.value = date1.value - day(date1.value);
とやれば同じように先月末が求められるような気がするが、実はこのコードは通らない!
sysdate()で求めた値は、関数を実行されたタイミングによって返される値が変わるので、内部的には変数扱いなのだが、値を変更できない仕様にされている。(固定文字列などと同じ扱い)
ということで、日付型を使う場合にはよく注意しないと、予期しない結果になってしまう。これも初心者がよくハマるポイント。