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

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

2012年11月2日金曜日

XPagesで日付/時刻型を扱うのは大変だ

11月です。寒いです。
筆者は暑さと寒さに弱いので、辛いです。

そういえば、筆者がスマホを取り替えて2週間が経ちますが、まだ1回もトラブルに見舞われていません。
こんなことなら、もっと早く取り替えてもらえば良かったです。auさん、ありがとう!


さて、今月は早めにブログを書いて、「なんだ、ちゃんとやってるジャン」という感じにしておきます。

では、本文に入る前に・・・
にほんブログ村 IT技術ブログへ
クリックしましたね?企業からのアクセスが多いのは分かるのですが、どうも閲覧回数とクリック数があいません。
ちゃんとクリックしてくださいね。


今日の話題は、XPagesでの日付/時刻のデータの取り扱いについてです。
XPagesでは、JavaScriptを使うこともあって、データ型に気をつけていないと、正しく計算が行えないのです。


日付型のデータを取得する場面を考えてみましょう。
全部では内科と思いますが、以下のようなものがあるでしょう。
  1. 画面上の日付コントロールの値を取得
  2. NotesXSPDocumentの値を取得
  3. NotesDocumentの値を取得

それぞれの値の取得方法を見てみます。
1.画面上の日付コントロールの値を取得の場合

getComponent( "コントロール名" ).getValue();
で取得できます。
これで取得した場合のデータ型は、「java.util.Date」になります。

2.NotesXSPDocumentの値を取得の場合
document1.getItemValueDate( "アイテム名" );
で取得できます。こちらのデータ型も、「java.util.Date」になります。

また、
document1.getItemValueDateTime( "アイテム名" );
で取得する方法もあります。こちらのデータ型は、「lotus.domino.local.DateTime」になります。

3.NotesDocumentの値を取得の場合
doc.getItemValueDateTimeArray( "アイテム名" );
で取得できます。こちらのデータ型は、「java.util.Vector」という配列のものになります。
値が一つしかない場合でも、この配列で返ってくるのがポイントです。
なお、配列の各要素のデータ型は、 NotesDateTimeもしくはNotesDateRangeになります。
getClass()メソッドで表示すると分かりますが、NotesDateTimeクラスは、「lotus.domino.local.DateTime」の事を指しています。

上記から分かるように、日付には「java.util.Date」と「lotus.domino.local.DateTime」の2種類があります。
これらは当然、値の比較や計算などは行えません。

しっかりと使い分けをする必要があります。

@Adjust()や@Year()など、@関数で使う場合は、引数が「java.util.Date」になり、
NotesDocumentクラスやNoteDatabaseクラス等、Domino JavaScriptクラス(呼び方が分からん・・・)の場合は、引数が「lotus.domino.local.DateTime」になりますので、
そのように使い分けをすると良いでしょう。


しかし、それぞれのデータ型の変換が出来ないようでは、このような使い分けも出来ません。
では、「java.util.Date」と「lotus.domino.local.DateTime」のデータ変換はどのように行えば良いのでしょうか?

1.「java.util.Date」から「lotus.domino.local.DateTime」への変換

session.createDateTime( "java.util.Date型の値" );
で行います。
これの戻り値は、NotesDateTimeクラスです。


2.「lotus.domino.local.DateTime」から「java.util.Date」への変換
notesDateTime.toJavaDate();
で行います。
これの戻り値は、java.util.Dateクラスです。


ちなみに、変数がどのクラスとして定義されているのかを確認したい場合は、
getClass()というメソッドを使うと良いです。

例えば・・・
var hiduke = getComponent( "date1" ).getValue();
print( "hidukeのクラスは、" + hiduke.getClass() );
とすると、
Dominoサーバのコンソールに、date1コントロールのクラス名が表示されます。



日付/時刻の計算がうまくいかない!と言う場合は、まずデータ型があっているかどうかを確認しましょう。
特に、2つの時刻の差を求めたい場合には、NotesDateTimeクラスのtimeDifference()メソッドを使うと良いです。


ということで、今日はこの辺で・・・




【PR】ノーツ/ドミノに関するお問い合わせは下記まで【PR】
単純なDBのカスタマイズから他アプリケーションとの連携までご要望にお応えします
Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: