(57)【要約】      （修正有）【課題】日時フォーマットの生成処理を軽量化する技法を提供する。【解決手段】初期化処理は、初期値となる基準時刻となるUTを取得し、年月日時分秒を計算した中間データと、有効範囲を与える。変換対象のUTデータに適合する有効範囲をもつ差分変換用データが存在する場合、その差分変換用データを用いて以下の手順で変換処理を実施する処理である。(1)変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。(2)中間データの年月日と、(1)で求めた時分秒より、変換後の年月日時分秒の値を作成する。(3)変換後の年月日時分秒から文字列フォーマットに変換する。(4)予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。(5)予め定めた条件が成立した場合、既存の差分変換用データを削除する。【選択図】図２
2014052747.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの処理により、日時フォーマットを計算する方法であって、
基準時刻のUT値を取得するステップと、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算するステップと、
変換対象UT値と前記基準時刻のUT値の差を計算するステップと、
前記UT値の差の値に基づき、時分秒の値を計算するステップと、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成するステップを有する、
方法。
【請求項２】
予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得するステップと、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直すステップを更に有する、請求項１に記載の方法。
【請求項３】
前記予め定めた条件が日の切り替わりである、請求項２に記載の方法。
【請求項４】
前記中間データが、tm構造体のデータ構造をもつ、請求項１に記載の方法。
【請求項５】
前記基準時刻のUT値として、同日0時0分のUT値がセットされる、請求項３に記載の方法。
【請求項６】
基準時刻の有効範囲として、下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒がセットされ、前記予め定めた条件が、前記変換対象UT値が、前記下限値と前記上限値の間にないことである、請求項５に記載の方法。
【請求項７】
時間が所定の値であることに応答して、翌日分の前記中間データと、前記有効範囲を予め計算して保存しておくステップを更に有する、請求項３に記載の方法。
【請求項８】
コンピュータの処理により、日時フォーマットを計算するプログラムであって、
前記コンピュータに、
基準時刻のUT値を取得するステップと、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算するステップと、
変換対象UT値と前記基準時刻のUT値の差を計算するステップと、
前記UT値の差の値に基づき、時分秒の値を計算するステップと、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成するステップを実行させる、
プログラム。
【請求項９】
予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得するステップと、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直すステップを更に前記コンピュータに実行させる、請求項８に記載のプログラム。
【請求項１０】
前記予め定めた条件が日の切り替わりである、請求項９に記載のプログラム。
【請求項１１】
前記中間データが、tm構造体のデータ構造をもつ、請求項８に記載のプログラム。
【請求項１２】
前記基準時刻のUT値として、同日0時0分のUT値がセットされる、請求項１０に記載のプログラム。
【請求項１３】
基準時刻の有効範囲として、下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒がセットされ、前記予め定めた条件が、前記変換対象UT値が、前記下限値と前記上限値の間にないことである、請求項１２に記載のプログラム。
【請求項１４】
時間が所定の値であることに応答して、翌日分の前記中間データと、前記有効範囲を予め計算して保存しておくステップを更に前記コンピュータに実行させる、請求項１０に記載のプログラム。
【請求項１５】
コンピュータの処理により、日時フォーマットを計算するシステムであって、
基準時刻のUT値を取得する手段と、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算する手段と、
変換対象UT値と前記基準時刻のUT値の差を計算する手段と、
前記UT値の差の値に基づき、時分秒の値を計算する手段と、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成する手段を有する、
システム。
【請求項１６】
予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得する手段と、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直す手段を更に有する、請求項１５に記載のシステム。
【請求項１７】
前記予め定めた条件が日の切り替わりである、請求項１６に記載のシステム。
【請求項１８】
前記中間データが、tm構造体のデータ構造をもつ、請求項１５に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、コンピュータ・システムに関し、より詳しくは、コンピュータ・システムにおける日時フォーマットの生成に関する。
【背景技術】
【０００２】
近年、次々に到来する時刻順のデータ（ストリームデータ）をリアルタイムに処理するデータ処理技法である、ストリーム処理が活用されるようになってきている。ストリーム処理は、リアルタイム処理とともに、大量データの高速変換処理という、従来ＥＴＬ(Extract/Transform/Load)として扱われてきた処理への活用が期待されている。この場合特に、コアあたりの処理速度が重要の指標となっている。ストリーム処理を行うためのソフトウェア・プラットフォームとして、例えば、IBM(R) InfoSphere(R) Streamsが利用可能であり、その上で、SPL (Stream Processing Language)が利用可能である。SPLについては、http://publib.boulder.ibm.com/infocenter/streams/v2r0/topic/com.ibm.swg.im.infosphere.streams.product.doc/doc/IBMInfoSphereStreams-SPLLanguageSpecification.pdfなどを参照されたい。
【０００３】
ストリーム処理において、日時フォーマットの変換は、頻繁に用いられる変換処理である。日時フォーマットの変換は一般的に、UNIX(R)時間 (以下、UTと称する)に基づき、標準関数を用いて生成されるが、コアあたりの秒間レートが１万件を超える処理を要求される場合、既存の標準関数の処理速度が性能低下の要因となる。
【０００４】
日時をあらわすデータは、ビジネスロジックにおいて非常に重要なデータであるため、安直にカスタム関数を作成して日時フォーマットを生成するよりも、標準関数を用いて生成する方が極めて望ましい。
【０００５】
このような標準関数として、Linux(R)のgmtime()やctime()、SPLのtime関数などが知られている。SPLのtime関数は、タイムゾーン(timezone)を引数に指定できる点で便利である。UT値から日時フォーマットを生成する標準関数の処理は、閏年を考慮したりする必要があるので、あまり軽量ではない。タイムゾーンを考慮して処理すると、さらに重くなる。このような標準関数が、ストリーム処理において極めて頻繁に呼び出されると、処理の負荷は無視できないものとなり、処理速度の低下を招く。
【０００６】
このため、標準関数を使用しつつ、日時フォーマットの生成処理を軽量化したいという要望がある。そこで、日時フォーマットの生成に関する従来技術として、下記の特許公開公報に記載のものが知られている。
【０００７】
特開平７−１５２７３５号公報は、日付、時刻、属性および文字列を含む各フィールドからなる論理時間データを格納する記憶手段と、文字列の時間データを入力し論理時間データとする入力手段と、論理時間データを評価して時間データに対する演算を行う時間評価手段と、論理時間データをフォーマット情報により所定の表現形式で表示出力する表示制御手段をもつ時間データ処理装置を開示する。
【０００８】
特開２００２−１４０２３８号公報は、クライアントＰＣが、通信回線を介しサーバに接続し、データベース内のデータを参照し、この際に、クライアントＰＣがウェッブブラウザによって、フォームの関数を実行してサーバタイムを取得し、Ｊａｖａ  Ｓｃｒｉｐｔによって自己のローカルタイムを取得し、この差分をもとめ、この差分によって、時間データを補正する技法を開示する。
【０００９】
しかし、上記従来技術は、日時フォーマットの生成処理を軽量化する技法を示唆するものではない。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開平７−１５２７３５号公報
【特許文献２】特開２００２−１４０２３８号公報
【非特許文献】
【００１１】
【非特許文献１】http://publib.boulder.ibm.com/infocenter/streams/v2r0/topic/com.ibm.swg.im.infosphere.streams.product.doc/doc/IBMInfoSphereStreams-SPLLanguageSpecification.pdf
【発明の概要】
【発明が解決しようとする課題】
【００１２】
従って、この発明の目的は、日時フォーマットの生成処理を軽量化するための、ストリーム処理に適用可能な技法を提供することにある。
【課題を解決するための手段】
【００１３】
この発明は、ストリーム処理やＥＴＬ処理で、処理されるレコードに含まれる時刻が近接している場合が多いことに着目して、UTから日時文字列への変換を高速化するものである。
【００１４】
すなわち、この発明に従うシステムは、日時変換の一番の問題となる日付の特定のために、基準時刻のUTに対して一度標準関数、例えばtime関数を実行しておき、それによって得た年月日時分秒の値は、所定の時間構造体などに中間データとして保持する。その後はUTの差分値から実際の時刻を計算する。
【００１５】
この発明に従う処理は、初期化処理と、実行処理とからなる。
【００１６】
初期化処理は、初期値となる基準時刻となるUTを取得し、以下の差分変換用データを計算する処理である。
−  基準時刻のUT値
−  基準時刻のUT値から年月日時分秒を計算した中間データ（tm構造体の値に相当）
−  基準時刻の有効範囲（UTの下限値と上限値）
【００１７】
実行処理は、変換対象のUTデータに適合する有効範囲をもつ差分変換用データが存在する場合、その差分変換用データを用いて以下の手順で変換処理を実施する処理である。より具体的には、次の処理を行う。
−  変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。
−  中間データの年月日と、上記のステップで求めた時分秒より、変換後の年月日時分秒の値を作成する。
−  変換後の年月日時分秒から文字列フォーマットに変換する。
【００１８】
実行処理では更に、次のような、差分変換用データの更新処理が実施される。
−  予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。この処理は実質的に、上記初期化処理と同じである。
−  予め定めた条件が成立した場合、既存の差分変換用データを削除する。
【発明の効果】
【００１９】
この発明によれば、日付変換の一番大きな問題となる日付の特定のために、基準時刻のUTに対して、一度time関数のような標準関数を実行しておき、あとは個々のUTの差分値から実際の実際の時刻を計算することにより、日付変換の処理が軽量化される。すなわち、差分値から時分秒を計算する処理は軽量であり、time関数の呼び出しを減らして、後は差分値から時分秒を計算する処理を使用することで、処理が高速化される。
【００２０】
また、差分計算が有効になるUTの値を設定することで、同一年月日をそのまま利用することが可能となる。年月日は、標準のtime関数から取得しているので正しさの信頼性が高い。
【００２１】
さらに、実行状況に応じて基準時刻に関連するUT値、中間データ及び有効範囲を追加、削除、変更することで、継続的な処理に対応可能となる。
【図面の簡単な説明】
【００２２】
【図１】本発明を実施するためのハードウェアのブロック図である。
【図２】本発明に従い日時フォーマットを生成するための機能のブロック図である。
【図３】本発明に従う時間計算ルーチンのフローチャートを示す図である。
【図４】差分変換用データの生成処理のフローチャートを示す図である。
【図５】夏時間用差分変換用データの生成処理のフローチャートを示す図である。
【図６】夏時間用差分変換用データの生成処理のフローチャートを示す図である。
【図７】夏時間用差分変換用データの生成処理のフローチャートを示す図である。
【発明を実施するための形態】
【００２３】
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
【００２４】
図１を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図１において、システム・バス１０２には、ＣＰＵ１０４と、主記憶（ＲＡＭ）１０６と、ハードディスク・ドライブ（ＨＤＤ）１０８と、キーボード１１０と、マウス１１２と、ディスプレイ１１４が接続されている。
【００２５】
本発明に使用可能なコンピュータ・ハードウェアは、これには限定されないが、IBM(R) System X3850である。このシステムにおいて、ＣＰＵ１０４は、インテル社のXeon(R)、主記憶１０６は好適には１６ＧＢ、ハードディスク・ドライブ１０８は好適には４ＴＢの容量である。
【００２６】
ハードディスク・ドライブ１０８には、オペレーティング・システムが、導入されている。オペレーティング・システムは、好適にはLinux（商標）であるが、UNIX時間(UT)をサポートするその他のオペレーティング・システムを使用することができる。
【００２７】
ハードディスク・ドライブ１０８には更に、IBM(R) InfoSphere(R) Streamsが導入され、その上で、SPL (Stream Processing Language)が利用可能である。
【００２８】
ハードディスク・ドライブ１０８には更に、SPLで書かれた、本発明に係る時間計算プログラムが保存されている。この時間計算プログラムについては、図２などを参照して、後で説明する。
【００２９】
キーボード１１０及びマウス１１２は、SPLを用いて、ストリーム処理のプログラムを書いたりするために使用される。
【００３０】
ディスプレイ１１４は、これには限定されないが、好適には、１０２４×７６８以上の解像度をもち、３２ビットtrue colorのＬＣＤモニタである。ストリーム処理のプログラムのソースコードを表示したり、ストリーム処理の途中経過を表示したりするために使用される。
【００３１】
通信インターフェース１１６は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。
【００３２】
図２は、ハードディスク・ドライブ１０８に保存され、ストリーム処理と連動して動作する、本発明の時間計算プログラムのブロック図を示す。変換対象UT値を受け取って、対応する日時ストリングを生成する機能をもつ。この時間計算プログラムは、この実施例では、上述のように、SPLで書かれているが、これに限定されず、C、C++、C#、Java(R)などの任意のプログラミング言語で作成することができる。
【００３３】
図２に示すように、時間計算プログラムは、変換対象UT値を受け取るメイン・ルーチンとしての時間計算ルーチン２０２と、時間計算ルーチン２０２から呼ばれる、差分変換用データの作成ルーチン２０４とからなる。
【００３４】
時間計算ルーチン２０２の処理は、図３のフローチャートを参照して、後で説明する。
【００３５】
差分変換用データの作成ルーチン２０４は、time関数を呼び出すことで、図４のフローチャートのステップ４０２で、データ生成の初期値となるUT値を取得する。ここで、データ生成の初期値となるUT値とは、最初に到着したデータが保持するUTや、現在時刻などが利用可能である。
【００３６】
データ生成の初期値となる中間データは、典型的には、下記のようなデータ構造をもつtm構造体であり、time標準関数を呼び出すと、各々の変数に値を格納される。
int tm_sec;   // 秒[0〜61](最大2秒のうるう秒を含む)
int tm_min;   // 分[0〜59]
int tm_hour;  // 時[0〜23]
int tm_mday;  // 日[1〜31]
int tm_mon;   // 月[0〜11](-1された月数)
int tm_year;  // 年(1900からの経過年数)
int tm_wday;  // 曜日[0〜6](日:0 月:1 火:2 水:3 木:4 金:5 土:6)
int tm_yday;  // 1月1日からの経過日数[0〜365]
int tm_isdst; // 夏時間の有無(0:なし 正の値:夏時間)
【００３７】
データ生成の初期値となるUT値と、上記中間データとから、同日0時0分の差分秒を取得し、以下を計算して、差分変換用データとする。
(1) 基準時刻のUT値 : 同日0時0分のUT値
(2) 基準時刻に対する中間データ : 同日0時0分のtm構造体値
(3) 基準時刻の有効範囲 : 下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒
【００３８】
差分変換用データの作成ルーチン２０４は、図２に示すように、これら３つの値である基準時刻のUT値２０６、中間データ２０８及び有効範囲２１０を、例えばＲＡＭ１０６の所定アドレスの位置に配置するなどして、時間計算ルーチン２０２が参照可能にする。
【００３９】
次に図３のフローチャートを参照して、時間計算ルーチン２０２の処理について説明する。図示されているように、この処理は、ステップ３０２からステップ３１８までの無限ループである。このループ内で、ステップ３０４で、時間計算ルーチン２０２は、逐次到着するデータの変換処理に対して日時フォーマットを生成するための変換対象UT値を取得する。
【００４０】
ステップ３０６で、時間計算ルーチン２０２は、新たな差分変換用データを生成／削除をするかどうか判断する。ここの判断は、基本的にはこれまで到着したデータおよび新たに到着したデータを入力とした評価関数により判定することになる。その評価関数の例は、次のとおりである。
a. 逐次流れてくるデータに特定の値が設定されている場合。
b. Punctuationという特殊な出たが到着したときに再初期化のフラグを立てておき、そのフラグをステップ３０６で判定する。
c. 変換しようとするＵＴ値が既存の「差分変換用データ」のいずれの範囲にも該当せず
、かつ過去の非該当データも含めたなんらかの評価関数により新規の「差分変換用データ」が必要と判定した場合。この評価関数として以下のような実装が考えられる。
c-1. 差分変換用データの範囲に合致した対象ＵＴの直近の値の分布を比較し、差分変換用データの範囲の最後の１０％内に到達している場合（対象ＵＴ値が連続的に遷移する場合への対応）。
c-2. 差分変換用データの有効範囲に合致しないUT値を記録し、一定数に達している場合（複数の異なるストリームがマージされる場合への対応）。
d. 既存の「差分変換用データ」が規定された期間まったく変換に用いられなかった場合。
【００４１】
ここの判断がyesになる場合の際のステップ３０８での処理により変換用データの生成
処理や削除処理を実施する。ここでの処理は、ステップ３０６の判断処理に対応した処理となり、００４０でのa,b,c-1,c-2,dの例に対する本処理の例は以下のとおりである。
a. そのデータがもつ時刻を用いて差分変換用データを生成する。
b. 次に到着するデータがもつ時刻を用いて差分変換用データを生成する。
c-1. 翌日分の差分変換用データを生成して追加する。
c-2. それらのデータをカバーする差分変換用データを、差分変換用データの作成ルーチン２０４を呼び出して生成し、追加する。
d. 使用されない差分変換用データを削除する。
また、差分変換用データの最大数を規定し、新たな差分変換用データを生成した際に最大数を超えた場合、最大数に達するまで、直近の使用頻度の最も低いものから順に削除する実装も可能である。
【００４２】
ステップ３０８での処理の後、あるいはステップ３０６での判断がnoであった場合には直接、時間計算ルーチン２０２はステップ３１０で、変換対象UT値を含む範囲が存在するかどうか判断する。これは具体的に、下限値 ≦ 変換対象UT値 ≦ 上限値かどうか判断することで行われる。下限値と上限値は、有効範囲２１０から取得する。もしその条件が満たされているなら、時間計算ルーチン２０２は、ステップ３１２で、変換対象UT値と基準時刻のUT値２０６の差時分秒を計算する。
// 基準時刻UTは同日0時0分0秒のUT値であるものとする
tmp1 = (変換対象のUT値) - (基準時刻UT値) // 0時0分0秒からの経過秒数
(時) = tmp1 / 3600;
tmp2 = tmp1 - (時) * 3600;
(分) = tmp / 60;
(秒) = tmp - (分) * 60;
時間計算ルーチン２０２は、上記のようにして計算した時分秒を、中間データ２０８から取得したデータに加えることにより、ステップ３１４で日時データ（日時フォーマット）を生成する。その際、好適には、C言語におけるsprintf()と同等の関数を用いることができる。
【００４３】
時間計算ルーチン２０２は、ステップ３１０で下限値 ≦ 変換対象UT値 ≦ 上限値が満たされていないと判断すると、ステップ３１６で、標準time関数を呼び出す既存の変換処理を用いて日時データを生成する。
【００４４】
上記の実施例は、夏時間(summer time)を考慮に入れていないので、次に夏時間を考慮に入れた実施例を説明する。夏時間を考慮に入れた実施例では、図４に示す差分変換用データの生成処理ルーチンが、図５に示す差分変換用データの生成処理ルーチンに置き換えられる。この場合、図３の時間計算ルーチン２０２は、同様でよい。
【００４５】
図５のフローチャートにおいて、夏時間用の差分変換用データの生成処理ルーチンは、ステップ５０２で、標準time関数を呼び出して、差分変換用データの生成用UT値に対する日時データを計算する。
【００４６】
夏時間用の差分変換用データの生成処理ルーチンは、ステップ５０２で計算した日時データを利用して、ステップ５０４で、標準時間と夏時間が切り替わる日からどうかを判断する。ここで、判断の日時は以下のとおりである。
標準時→夏時間（３月第２日曜日午前２時）：同日の２〜３時は存在せず１日が２３時間となる（1時59分59秒の次が3時00分00秒）
夏時間→標準時（１１月第１日曜日午前２時）：同日は１〜２時が２度存在し、１日が２５時間となる（1時59分59秒の次が1時00分00秒）
【００４７】
標準時→夏時間への切り替わりの場合は、ステップ５０６で、図６に示すフローチャートの処理を実行する。
【００４８】
すなわち、図６において、夏時間用の差分変換用データの生成処理ルーチンは、ステップ６０２で、基準時刻１＝差分変換用データの生成用UT値から計算した同日0時0分のUT値とする処理を実行する。
【００４９】
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ６０４で、標準時間から夏時間に切り替わるまでの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた夏時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
【００５０】
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ６０６で、夏時間に切り替わってから同日２４時までの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=(基準時刻1-3600)
基準時刻に対する中間データ=基準時刻1からもとめた夏時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+23*3600)を上限値とする範囲
【００５１】
夏時間→標準時への切り替わりの場合は、ステップ５０８で、図７に示すフローチャートの処理を実行する。
【００５２】
すなわち、図７において、夏時間用の差分変換用データの生成処理ルーチンは、ステップ７０２で、基準時刻１＝差分変換用データの生成用UT値から計算した同日0時0分のUT値とする処理を実行する。
【００５３】
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ７０４で、夏時間から標準時間に切り替わるまでの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた標準時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
【００５４】
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ７０６で、標準時間に切り替わってから同日２４時までの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=(基準時刻1+3600)
基準時刻に対する中間データ=基準時刻1からもとめた標準時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+25*3600)を上限値とする範囲
【００５５】
図５のフローチャートに戻って、標準時→夏時間への切り替わりでもなく、夏時間→標準時への切り替わりでもない場合は、ステップ５１０で、図４のステップ４０２で説明したのと同様の処理を行う。
【００５６】
次に、従来技術において、SPLのtime関数を用いて日時フォーマットを生成する実装例のコードを示す。
type InputFile_T =
int64  timeUT; // Unix Time
type InternalData_T =
rstring  stringTime; // YYYYMMDDhhmmss
composite UtStrConverterTimeC (output Out; input In) {
graph
stream <InternalData_T> Out as Output = Functor(In as Input) {
logic
state : {
mutable Sys.tm stm = {sec=0,min=0,hour=0,mday=0,mon=0,year=0,wday=0,yday=0,isdst=0,gmtoff=0,zone=""};
mutable rstring timeStr;
}
onTuple Input: {
// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// Start time format conversion
// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
timestamp ts = createTimestamp(Input.timeUT, 0u);
time(ts, "JST", stm);
timeStr = strftime(stm, "%Y%m%d%H%M%S");
}
output Output:
stringTime = timeStr;
}
}
【００５７】
また、本発明に従い、SPLによって日時フォーマットを生成する実装例のコードを示す。
type InputFile_T =
int64  timeUT; // Unix Time
type InternalData_T =
rstring  stringTime; // YYYYMMDDhhmmss
int64 getNanosecondFrom000000(Sys.tm stm) {
return (int64)(stm.hour * 3600 + stm.min * 60 + stm.sec) * 1000000000l;
}
composite UtStrConverterOptT1 (output Out; input In) {
graph
stream <InternalData_T> Out as Output = Functor(In as Input) {
logic
state : {
mutable Sys.tm  stm = {sec=0,min=0,hour=0,mday=0,mon=0,year=0,wday=0,yday=0,isdst=0,gmtoff=0,zone=""};
mutable rstring timeStr;
mutable boolean isInitialized = false;
mutable timestamp currentTimestamp, ts000000, ts240000;
}
onPunct Input: {
isInitialized = false; // Punctuationを受け取るごとに差分計算用データを再計算する
}
onTuple Input: {
if (!isInitialized) {
currentTimestamp = createTimestamp(Input.timeUT, 0u);
time(currentTimestamp, "UTC", stm);
int64 diff = getNanosecondFrom000000(stm);
ts000000 = add(currentTimestamp, (-diff));
ts240000 = add(ts000000, (24l*3600l*1000000000l));
stm.sec = 0; stm.min = 0; stm.hour = 0; 
isInitialized = true;
}
// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// Start time format conversion
// mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
timestamp ts = createTimestamp(Input.timeUT, 0u);
if (ts000000 <= ts && ts < ts240000) {
int32 sec = (int32)(diffAsNanos(ts, ts000000) / 1000000000l);
stm.hour = sec / 3600;
int32 sec2 = sec - stm.hour * 3600;
stm.min = sec2 / 60;
stm.sec = sec2 - stm.min * 60;
timeStr = strftime(stm, “%Y%m%d%H%M%S”); // この文字列処理は、Native Functionを用いてC++のsprintf()でも実装できる
} else {
mutable Sys.tm stmCurr = {sec=0,min=0,hour=0,mday=0,mon=0,year=0,wday=0,yday=0,isdst=0,gmtoff=0,zone=""};
time(ts, "JST", stmCurr);
timeStr = strftime(stmCurr, "%Y%m%d%H%M%S");
}
}
output Output :
stringTime  = timeStr;
}
}
【００５８】
以上、本発明を、IBM(R) InfoSphere(R) Streams上で、SPL (Stream Processing Language)により実装する実施例により説明してきたが、本発明は、UNIX時間を利用可能な任意のオペレーティング・システム上の、任意のプログラミング言語で書かれたプログラムにより実現可能であることを理解されたい。
【００５９】
また、上記の実施例では、中間データとしてtm構造体を使用したが、これは一例に過ぎず、中間データとして、当業者が利用可能な任意のデータ構造を使用することができる。
【００６０】
さらに、新たに基準時刻のUT値を取得するタイミングは、一日の切り替わりでなく、１時間おきなど任意のタイミングに設定してもよい。
【符号の説明】
【００６１】
１０４・・・ＣＰＵ
１０６・・・ＲＡＭ
１０８・・・ハードディスク・ドライブ
２０２・・・時間計算ルーチン
２０４・・・差分変換用データの生成ルーチン
２０６・・・基準時刻のUT値
２０８・・・中間データ
２１０・・・有効範囲
【図１】
2014052747.tif 000003
【図２】
2014052747.tif 000004
【図３】
2014052747.tif 000005
【図４】
2014052747.tif 000006
【図５】
2014052747.tif 000007
【図６】
2014052747.tif 000008
【図７】
2014052747.tif 000009