今日(執筆時点)は2014年3月25日です。6年前の今日、ブログを始めました。
初の記事は、上級だぁですね。まだNotes 8.0が発売開始されたばかりの頃でNotes 7.0の資格試験を受験したという話ですね。
私はこの後、紆余曲折を経てIBM Certified Advanced Application Developer - Lotus Notes and Domino 8.5の資格をなんとか取得することができましたが、すでにNotes 9.0の資格試験が始まっているのですね。
どうしよう、受験しなくちゃ・・・
さて、ということで本日が本当の丸六年の日となります。
そんな日なので記事を更新しないわけにはいかないでしょう。
では、本題に入る前に6年目最後のボタンをクリックしましょう(でも、明日以降にこの記事を見ることもあるんだよね・・・ま、いっか)

今日はXPagesで利用できる@関数についてです。
@Adjust()関数という関数があります。指定した日付のy年m月z日h時間m分s秒前/後を算出するというものですね。
例えば、2014年4月1日の1か月後の日付は@Adjust( @TextToTime("2014/04/01"), 0, 1, 0, 0, 0, 0 )で算出できます。
結果は、2014/05/01が返ってきます。
実はこの関数、不具合があるようなのです。
指定した日付の前月が30日以下の場合(つまり、3月、5月、7月、10月、12月)、1か月後の値が正しく計算されないのです。
以下のような簡単なコードを作成して実行してみました。
var tmpDate; var dspDate; for ( var i=1;i<=12;i++ ) { dspDate = "2014/" + i + "/01"; tmpDate = @TextToTime( dspDate ); print( dspDate + "の翌月は" + @Adjust( tmpDate, 0, 1, 0, 0, 0, 0 ).toLocaleString() + "です。" ); }実行結果は次の通り。
![]() |
1~12月の翌月1日を出力した結果 |
赤文字になっているところを見てください。なぜか、31日になっていたり、29日になっていたりします。
確かに、前月が30日以下の月だけが誤った結果になっていることがわかります。
別の方法はいくつかありますが、例えばこんな方法があります。
var tmpDate; var dspDate; for ( i=1;i<=12;i++ ) { dspDate = "2014/" + i + "/01"; tmpDate = session.createDateTime( dspDate ); tmpDate.adjustMonth(1); print( dspDate + "の翌月は" + tmpDate.getLocalTime() + "です。" ); }こちらの実行結果は次の通り。
![]() |
1~12月の翌月1日を出力した結果(2) |
今のところ、Domino 8.5.2、9.0.1で確認していますが、他のバージョンでも発生する可能性がありますので、XPagesで@Adjust()関数を使う場合は気を付けましょう。
きっとそのうち修正されると思います・・・
2014/03/25 17:05追記-----
@Adjust( tmpDate, 0, 1, 0, 0, 0, 0 )
を
@Adjust( tmpDate, 0, 1, 0, 0, 0, 0, "[InLocalTime]" )
と"[InLocalTime]"キーワードを追加することによっても、正しい結果を得ることができました。
2014/03/25 17:05追記-----
では、今日はこの辺で。
【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします!
