当ブログに掲載しているサンプルは、すべて利用者の自己責任という形でお願いします。
ただし、明らかな不具合がある場合、ご連絡いただければ、訂正記事を出します。
また、こちらのサンプルは、別のサイト等への公開、転載は一切禁止しています。
どうしてもと言う場合は、筆者にあらかじめご連絡ください。
記事そのもののリンクについてはご自由に行っていただいてよいです。

テクてく Lotus 技術者 Slack に参加しよう!

2014年3月25日火曜日

XPagesの@Adjust関数で誤った結果が出力される

おはようございます。
今日(執筆時点)は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年目最後のボタンをクリックしましょう(でも、明日以降にこの記事を見ることもあるんだよね・・・ま、いっか)
にほんブログ村 IT技術ブログへ



今日は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のカスタマイズから他アプリケーションとの連携までご要望にお応えします!
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: