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

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

2016年8月9日火曜日

XPagesでISO8601形式の日時表記をする際は気を付けましょう

皆さん、こんにちは。暑い日が続きますが、XPages開発はしてますか?

私は・・・しばらくしてませんでした。
そのせいなのか?開発の勘を取り戻すのにちょっと苦労しました(え?そんなにできやしない癖に何を偉そうにって?スミマセン・・・)


さて、閑話休題。
今日もXPagesでの日付の話題です。
XPagesはWebアプリケーションなので、日付の扱いがNotesクライアントと異なるために、色々と難しい問題を抱えています。
っていうか、Webの世界での日付の扱いが雑すぎるんじゃないか?って思ってますw

今回はISO8601形式についてです。
色々と検索してみると、
基本形式と拡張形式の2種類があって、
それぞれ
基本形式: yyyymmddThhMMss
拡張形式: yyyy-mm-ddThh:MM:ssZ
という表示の仕方(UTC形式の場合)をするという認識でした。

そして、日時をこの形式に変換するのには、
DateクラスのtoISOString()メソッドを使うものだと思ってました。えぇ、今朝までは・・・

なので、XPagesでもそうだろうと思い、プログラムを実装して動かしてみたら、
動かない!っていうか、正しく変換されない!
どういうことよ!!!

と思って、SSJSとCSJSで同じ関数を実行して違いを確認してみました。

XPageの画面に、ボタンコントロールを配置して、それぞれSSJSとCSJSを記述しました。
また、「ssjsDate1」「csjsDate1」という計算結果コントロールを埋め込んでます。


SSJSのソース
var sdate = "2016/08/10";
var stime = "10:00:00";
var sdt1  = new Date( sdate + " " + stime ).toISOString();
getComponent( "ssjsDate1" ).setValue( sdt1 );


CSJSのソース
var sdate = "2016/08/10";
var stime = "10:00:00";
var sdt1  = new Date( sdate + " " + stime ).toISOString();
document.getElementById( "#{id:csjsDate1}" ).innerHTML = sdt1;


実行した結果がこちら・・・
toISOStringの実行結果

CSJSの方は、思惑通りに表示されましたが、SSJSの方は違う形で表示されています。
はい、私がプログラムに組み込んだのはSSJSの方でした。
こりゃー、動かないよね。

なんでよ!なんでだよ!どういうことだよ!
と一人で勝手に怒っていましたが、おちついてヘルプを読むことにしました。
すると、Domino Designerヘルプには
「国際標準化機構 (ISO) 規格 8601 では、年、月、日、時、分、秒の順序を規定しています。 http://www.iso.org/iso/catalogue_detail?csnumber=40874 を参照してください。」
という一文があるじゃないですか。

年月日時分秒を順序を規定???
あー、確かに順序は決まってますねー。
って、そういうもんなの???


ということで今回は結論が出ないままです。
誰か、XPagesのSSJSで日付を
「拡張形式: yyyy-mm-ddThh:MM:ssZ」
の形式に出力する方法を教えてください(今のところ、年月日時分秒を分解して文字列連結するくらいしか思いつかない・・・)


では今日はこの辺で(笑)



Notes/Dominoで困ったことがあれば、弊社にお問い合わせください。
IBM Championの私が承ります!
お問い合わせはこちらから→Lotus Notes/Domino カスタマイズとセキュリティ強化 - 株式会社エフ

0 件のコメント: