JP2014052747A - 日時フォーマットの生成方法、プログラム及びシステム - Google Patents
日時フォーマットの生成方法、プログラム及びシステム Download PDFInfo
- Publication number
- JP2014052747A JP2014052747A JP2012195544A JP2012195544A JP2014052747A JP 2014052747 A JP2014052747 A JP 2014052747A JP 2012195544 A JP2012195544 A JP 2012195544A JP 2012195544 A JP2012195544 A JP 2012195544A JP 2014052747 A JP2014052747 A JP 2014052747A
- Authority
- JP
- Japan
- Prior art keywords
- value
- time
- reference time
- hour
- day
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/11—File system administration, e.g. details of archiving or snapshots
- G06F16/116—Details of conversion of file system types or formats
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/258—Data format conversion from or to a database
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Complex Calculations (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
【課題】日時フォーマットの生成処理を軽量化する技法を提供する。
【解決手段】初期化処理は、初期値となる基準時刻となるUTを取得し、年月日時分秒を計算した中間データと、有効範囲を与える。変換対象のUTデータに適合する有効範囲をもつ差分変換用データが存在する場合、その差分変換用データを用いて以下の手順で変換処理を実施する処理である。(1)変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。(2)中間データの年月日と、(1)で求めた時分秒より、変換後の年月日時分秒の値を作成する。(3)変換後の年月日時分秒から文字列フォーマットに変換する。(4)予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。(5)予め定めた条件が成立した場合、既存の差分変換用データを削除する。
【選択図】図2
【解決手段】初期化処理は、初期値となる基準時刻となるUTを取得し、年月日時分秒を計算した中間データと、有効範囲を与える。変換対象のUTデータに適合する有効範囲をもつ差分変換用データが存在する場合、その差分変換用データを用いて以下の手順で変換処理を実施する処理である。(1)変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。(2)中間データの年月日と、(1)で求めた時分秒より、変換後の年月日時分秒の値を作成する。(3)変換後の年月日時分秒から文字列フォーマットに変換する。(4)予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。(5)予め定めた条件が成立した場合、既存の差分変換用データを削除する。
【選択図】図2
Description
この発明は、コンピュータ・システムに関し、より詳しくは、コンピュータ・システムにおける日時フォーマットの生成に関する。
近年、次々に到来する時刻順のデータ(ストリームデータ)をリアルタイムに処理するデータ処理技法である、ストリーム処理が活用されるようになってきている。ストリーム処理は、リアルタイム処理とともに、大量データの高速変換処理という、従来ETL(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と称する)に基づき、標準関数を用いて生成されるが、コアあたりの秒間レートが1万件を超える処理を要求される場合、既存の標準関数の処理速度が性能低下の要因となる。
日時をあらわすデータは、ビジネスロジックにおいて非常に重要なデータであるため、安直にカスタム関数を作成して日時フォーマットを生成するよりも、標準関数を用いて生成する方が極めて望ましい。
このような標準関数として、Linux(R)のgmtime()やctime()、SPLのtime関数などが知られている。SPLのtime関数は、タイムゾーン(timezone)を引数に指定できる点で便利である。UT値から日時フォーマットを生成する標準関数の処理は、閏年を考慮したりする必要があるので、あまり軽量ではない。タイムゾーンを考慮して処理すると、さらに重くなる。このような標準関数が、ストリーム処理において極めて頻繁に呼び出されると、処理の負荷は無視できないものとなり、処理速度の低下を招く。
このため、標準関数を使用しつつ、日時フォーマットの生成処理を軽量化したいという要望がある。そこで、日時フォーマットの生成に関する従来技術として、下記の特許公開公報に記載のものが知られている。
特開平7−152735号公報は、日付、時刻、属性および文字列を含む各フィールドからなる論理時間データを格納する記憶手段と、文字列の時間データを入力し論理時間データとする入力手段と、論理時間データを評価して時間データに対する演算を行う時間評価手段と、論理時間データをフォーマット情報により所定の表現形式で表示出力する表示制御手段をもつ時間データ処理装置を開示する。
特開2002−140238号公報は、クライアントPCが、通信回線を介しサーバに接続し、データベース内のデータを参照し、この際に、クライアントPCがウェッブブラウザによって、フォームの関数を実行してサーバタイムを取得し、Java Scriptによって自己のローカルタイムを取得し、この差分をもとめ、この差分によって、時間データを補正する技法を開示する。
しかし、上記従来技術は、日時フォーマットの生成処理を軽量化する技法を示唆するものではない。
http://publib.boulder.ibm.com/infocenter/streams/v2r0/topic/com.ibm.swg.im.infosphere.streams.product.doc/doc/IBMInfoSphereStreams-SPLLanguageSpecification.pdf
従って、この発明の目的は、日時フォーマットの生成処理を軽量化するための、ストリーム処理に適用可能な技法を提供することにある。
この発明は、ストリーム処理やETL処理で、処理されるレコードに含まれる時刻が近接している場合が多いことに着目して、UTから日時文字列への変換を高速化するものである。
すなわち、この発明に従うシステムは、日時変換の一番の問題となる日付の特定のために、基準時刻のUTに対して一度標準関数、例えばtime関数を実行しておき、それによって得た年月日時分秒の値は、所定の時間構造体などに中間データとして保持する。その後はUTの差分値から実際の時刻を計算する。
この発明に従う処理は、初期化処理と、実行処理とからなる。
初期化処理は、初期値となる基準時刻となるUTを取得し、以下の差分変換用データを計算する処理である。
− 基準時刻のUT値
− 基準時刻のUT値から年月日時分秒を計算した中間データ(tm構造体の値に相当)
− 基準時刻の有効範囲(UTの下限値と上限値)
− 基準時刻のUT値
− 基準時刻のUT値から年月日時分秒を計算した中間データ(tm構造体の値に相当)
− 基準時刻の有効範囲(UTの下限値と上限値)
実行処理は、変換対象のUTデータに適合する有効範囲をもつ差分変換用データが存在する場合、その差分変換用データを用いて以下の手順で変換処理を実施する処理である。より具体的には、次の処理を行う。
− 変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。
− 中間データの年月日と、上記のステップで求めた時分秒より、変換後の年月日時分秒の値を作成する。
− 変換後の年月日時分秒から文字列フォーマットに変換する。
− 変換対象UT値と基準時刻のUT値の差分より変換対象UT値に対する時分秒を計算する。
− 中間データの年月日と、上記のステップで求めた時分秒より、変換後の年月日時分秒の値を作成する。
− 変換後の年月日時分秒から文字列フォーマットに変換する。
実行処理では更に、次のような、差分変換用データの更新処理が実施される。
− 予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。この処理は実質的に、上記初期化処理と同じである。
− 予め定めた条件が成立した場合、既存の差分変換用データを削除する。
− 予め定めた条件が成立した場合、新たな基準時刻を取得し、差分変換用データを生成し、追加する。この処理は実質的に、上記初期化処理と同じである。
− 予め定めた条件が成立した場合、既存の差分変換用データを削除する。
この発明によれば、日付変換の一番大きな問題となる日付の特定のために、基準時刻のUTに対して、一度time関数のような標準関数を実行しておき、あとは個々のUTの差分値から実際の実際の時刻を計算することにより、日付変換の処理が軽量化される。すなわち、差分値から時分秒を計算する処理は軽量であり、time関数の呼び出しを減らして、後は差分値から時分秒を計算する処理を使用することで、処理が高速化される。
また、差分計算が有効になるUTの値を設定することで、同一年月日をそのまま利用することが可能となる。年月日は、標準のtime関数から取得しているので正しさの信頼性が高い。
さらに、実行状況に応じて基準時刻に関連するUT値、中間データ及び有効範囲を追加、削除、変更することで、継続的な処理に対応可能となる。
以下、図面に従って、本発明の実施例を説明する。これらの実施例は、本発明の好適な態様を説明するためのものであり、発明の範囲をここで示すものに限定する意図はないことを理解されたい。また、以下の図を通して、特に断わらない限り、同一符号は、同一の対象を指すものとする。
図1を参照すると、本発明の一実施例に係るシステム構成及び処理を実現するためのコンピュータ・ハードウェアのブロック図が示されている。図1において、システム・バス102には、CPU104と、主記憶(RAM)106と、ハードディスク・ドライブ(HDD)108と、キーボード110と、マウス112と、ディスプレイ114が接続されている。
本発明に使用可能なコンピュータ・ハードウェアは、これには限定されないが、IBM(R) System X3850である。このシステムにおいて、CPU104は、インテル社のXeon(R)、主記憶106は好適には16GB、ハードディスク・ドライブ108は好適には4TBの容量である。
ハードディスク・ドライブ108には、オペレーティング・システムが、導入されている。オペレーティング・システムは、好適にはLinux(商標)であるが、UNIX時間(UT)をサポートするその他のオペレーティング・システムを使用することができる。
ハードディスク・ドライブ108には更に、IBM(R) InfoSphere(R) Streamsが導入され、その上で、SPL (Stream Processing Language)が利用可能である。
ハードディスク・ドライブ108には更に、SPLで書かれた、本発明に係る時間計算プログラムが保存されている。この時間計算プログラムについては、図2などを参照して、後で説明する。
キーボード110及びマウス112は、SPLを用いて、ストリーム処理のプログラムを書いたりするために使用される。
ディスプレイ114は、これには限定されないが、好適には、1024×768以上の解像度をもち、32ビットtrue colorのLCDモニタである。ストリーム処理のプログラムのソースコードを表示したり、ストリーム処理の途中経過を表示したりするために使用される。
通信インターフェース116は、好適には、イーサネット(R)プロトコルにより、ネットワークと接続されている。
図2は、ハードディスク・ドライブ108に保存され、ストリーム処理と連動して動作する、本発明の時間計算プログラムのブロック図を示す。変換対象UT値を受け取って、対応する日時ストリングを生成する機能をもつ。この時間計算プログラムは、この実施例では、上述のように、SPLで書かれているが、これに限定されず、C、C++、C#、Java(R)などの任意のプログラミング言語で作成することができる。
図2に示すように、時間計算プログラムは、変換対象UT値を受け取るメイン・ルーチンとしての時間計算ルーチン202と、時間計算ルーチン202から呼ばれる、差分変換用データの作成ルーチン204とからなる。
時間計算ルーチン202の処理は、図3のフローチャートを参照して、後で説明する。
差分変換用データの作成ルーチン204は、time関数を呼び出すことで、図4のフローチャートのステップ402で、データ生成の初期値となる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:なし 正の値:夏時間)
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秒
(1) 基準時刻のUT値 : 同日0時0分のUT値
(2) 基準時刻に対する中間データ : 同日0時0分のtm構造体値
(3) 基準時刻の有効範囲 : 下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒
差分変換用データの作成ルーチン204は、図2に示すように、これら3つの値である基準時刻のUT値206、中間データ208及び有効範囲210を、例えばRAM106の所定アドレスの位置に配置するなどして、時間計算ルーチン202が参照可能にする。
次に図3のフローチャートを参照して、時間計算ルーチン202の処理について説明する。図示されているように、この処理は、ステップ302からステップ318までの無限ループである。このループ内で、ステップ304で、時間計算ルーチン202は、逐次到着するデータの変換処理に対して日時フォーマットを生成するための変換対象UT値を取得する。
ステップ306で、時間計算ルーチン202は、新たな差分変換用データを生成/削除をするかどうか判断する。ここの判断は、基本的にはこれまで到着したデータおよび新たに到着したデータを入力とした評価関数により判定することになる。その評価関数の例は、次のとおりである。
a. 逐次流れてくるデータに特定の値が設定されている場合。
b. Punctuationという特殊な出たが到着したときに再初期化のフラグを立てておき、そのフラグをステップ306で判定する。
c. 変換しようとするUT値が既存の「差分変換用データ」のいずれの範囲にも該当せず
、かつ過去の非該当データも含めたなんらかの評価関数により新規の「差分変換用データ」が必要と判定した場合。この評価関数として以下のような実装が考えられる。
c-1. 差分変換用データの範囲に合致した対象UTの直近の値の分布を比較し、差分変換用データの範囲の最後の10%内に到達している場合(対象UT値が連続的に遷移する場合への対応)。
c-2. 差分変換用データの有効範囲に合致しないUT値を記録し、一定数に達している場合(複数の異なるストリームがマージされる場合への対応)。
d. 既存の「差分変換用データ」が規定された期間まったく変換に用いられなかった場合。
a. 逐次流れてくるデータに特定の値が設定されている場合。
b. Punctuationという特殊な出たが到着したときに再初期化のフラグを立てておき、そのフラグをステップ306で判定する。
c. 変換しようとするUT値が既存の「差分変換用データ」のいずれの範囲にも該当せず
、かつ過去の非該当データも含めたなんらかの評価関数により新規の「差分変換用データ」が必要と判定した場合。この評価関数として以下のような実装が考えられる。
c-1. 差分変換用データの範囲に合致した対象UTの直近の値の分布を比較し、差分変換用データの範囲の最後の10%内に到達している場合(対象UT値が連続的に遷移する場合への対応)。
c-2. 差分変換用データの有効範囲に合致しないUT値を記録し、一定数に達している場合(複数の異なるストリームがマージされる場合への対応)。
d. 既存の「差分変換用データ」が規定された期間まったく変換に用いられなかった場合。
ここの判断がyesになる場合の際のステップ308での処理により変換用データの生成
処理や削除処理を実施する。ここでの処理は、ステップ306の判断処理に対応した処理となり、0040でのa,b,c-1,c-2,dの例に対する本処理の例は以下のとおりである。
a. そのデータがもつ時刻を用いて差分変換用データを生成する。
b. 次に到着するデータがもつ時刻を用いて差分変換用データを生成する。
c-1. 翌日分の差分変換用データを生成して追加する。
c-2. それらのデータをカバーする差分変換用データを、差分変換用データの作成ルーチン204を呼び出して生成し、追加する。
d. 使用されない差分変換用データを削除する。
また、差分変換用データの最大数を規定し、新たな差分変換用データを生成した際に最大数を超えた場合、最大数に達するまで、直近の使用頻度の最も低いものから順に削除する実装も可能である。
処理や削除処理を実施する。ここでの処理は、ステップ306の判断処理に対応した処理となり、0040でのa,b,c-1,c-2,dの例に対する本処理の例は以下のとおりである。
a. そのデータがもつ時刻を用いて差分変換用データを生成する。
b. 次に到着するデータがもつ時刻を用いて差分変換用データを生成する。
c-1. 翌日分の差分変換用データを生成して追加する。
c-2. それらのデータをカバーする差分変換用データを、差分変換用データの作成ルーチン204を呼び出して生成し、追加する。
d. 使用されない差分変換用データを削除する。
また、差分変換用データの最大数を規定し、新たな差分変換用データを生成した際に最大数を超えた場合、最大数に達するまで、直近の使用頻度の最も低いものから順に削除する実装も可能である。
ステップ308での処理の後、あるいはステップ306での判断がnoであった場合には直接、時間計算ルーチン202はステップ310で、変換対象UT値を含む範囲が存在するかどうか判断する。これは具体的に、下限値 ≦ 変換対象UT値 ≦ 上限値かどうか判断することで行われる。下限値と上限値は、有効範囲210から取得する。もしその条件が満たされているなら、時間計算ルーチン202は、ステップ312で、変換対象UT値と基準時刻のUT値206の差時分秒を計算する。
// 基準時刻UTは同日0時0分0秒のUT値であるものとする
tmp1 = (変換対象のUT値) - (基準時刻UT値) // 0時0分0秒からの経過秒数
(時) = tmp1 / 3600;
tmp2 = tmp1 - (時) * 3600;
(分) = tmp / 60;
(秒) = tmp - (分) * 60;
時間計算ルーチン202は、上記のようにして計算した時分秒を、中間データ208から取得したデータに加えることにより、ステップ314で日時データ(日時フォーマット)を生成する。その際、好適には、C言語におけるsprintf()と同等の関数を用いることができる。
// 基準時刻UTは同日0時0分0秒のUT値であるものとする
tmp1 = (変換対象のUT値) - (基準時刻UT値) // 0時0分0秒からの経過秒数
(時) = tmp1 / 3600;
tmp2 = tmp1 - (時) * 3600;
(分) = tmp / 60;
(秒) = tmp - (分) * 60;
時間計算ルーチン202は、上記のようにして計算した時分秒を、中間データ208から取得したデータに加えることにより、ステップ314で日時データ(日時フォーマット)を生成する。その際、好適には、C言語におけるsprintf()と同等の関数を用いることができる。
時間計算ルーチン202は、ステップ310で下限値 ≦ 変換対象UT値 ≦ 上限値が満たされていないと判断すると、ステップ316で、標準time関数を呼び出す既存の変換処理を用いて日時データを生成する。
上記の実施例は、夏時間(summer time)を考慮に入れていないので、次に夏時間を考慮に入れた実施例を説明する。夏時間を考慮に入れた実施例では、図4に示す差分変換用データの生成処理ルーチンが、図5に示す差分変換用データの生成処理ルーチンに置き換えられる。この場合、図3の時間計算ルーチン202は、同様でよい。
図5のフローチャートにおいて、夏時間用の差分変換用データの生成処理ルーチンは、ステップ502で、標準time関数を呼び出して、差分変換用データの生成用UT値に対する日時データを計算する。
夏時間用の差分変換用データの生成処理ルーチンは、ステップ502で計算した日時データを利用して、ステップ504で、標準時間と夏時間が切り替わる日からどうかを判断する。ここで、判断の日時は以下のとおりである。
標準時→夏時間(3月第2日曜日午前2時):同日の2〜3時は存在せず1日が23時間となる(1時59分59秒の次が3時00分00秒)
夏時間→標準時(11月第1日曜日午前2時):同日は1〜2時が2度存在し、1日が25時間となる(1時59分59秒の次が1時00分00秒)
標準時→夏時間(3月第2日曜日午前2時):同日の2〜3時は存在せず1日が23時間となる(1時59分59秒の次が3時00分00秒)
夏時間→標準時(11月第1日曜日午前2時):同日は1〜2時が2度存在し、1日が25時間となる(1時59分59秒の次が1時00分00秒)
標準時→夏時間への切り替わりの場合は、ステップ506で、図6に示すフローチャートの処理を実行する。
すなわち、図6において、夏時間用の差分変換用データの生成処理ルーチンは、ステップ602で、基準時刻1=差分変換用データの生成用UT値から計算した同日0時0分のUT値とする処理を実行する。
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ604で、標準時間から夏時間に切り替わるまでの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた夏時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた夏時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ606で、夏時間に切り替わってから同日24時までの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=(基準時刻1-3600)
基準時刻に対する中間データ=基準時刻1からもとめた夏時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+23*3600)を上限値とする範囲
基準時刻のUT値=(基準時刻1-3600)
基準時刻に対する中間データ=基準時刻1からもとめた夏時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+23*3600)を上限値とする範囲
夏時間→標準時への切り替わりの場合は、ステップ508で、図7に示すフローチャートの処理を実行する。
すなわち、図7において、夏時間用の差分変換用データの生成処理ルーチンは、ステップ702で、基準時刻1=差分変換用データの生成用UT値から計算した同日0時0分のUT値とする処理を実行する。
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ704で、夏時間から標準時間に切り替わるまでの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた標準時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
基準時刻のUT値=基準時刻1
基準時刻に対する中間データ=(基準時刻1)からもとめた標準時間になる前のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1)を下限値、(基準時刻1+2*3600)を上限値とする範囲
夏時間用の差分変換用データの生成処理ルーチンは次に、ステップ706で、標準時間に切り替わってから同日24時までの範囲に対する差分変換用データを生成するために、以下の計算を行う。
基準時刻のUT値=(基準時刻1+3600)
基準時刻に対する中間データ=基準時刻1からもとめた標準時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+25*3600)を上限値とする範囲
基準時刻のUT値=(基準時刻1+3600)
基準時刻に対する中間データ=基準時刻1からもとめた標準時間になった後のUT値を用いて生成した中間データ
基準時刻の有効範囲=(基準時刻1+2*3600)を下限値、(基準時刻+25*3600)を上限値とする範囲
図5のフローチャートに戻って、標準時→夏時間への切り替わりでもなく、夏時間→標準時への切り替わりでもない場合は、ステップ510で、図4のステップ402で説明したのと同様の処理を行う。
次に、従来技術において、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;
}
}
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;
}
}
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値を取得するタイミングは、一日の切り替わりでなく、1時間おきなど任意のタイミングに設定してもよい。
104・・・CPU
106・・・RAM
108・・・ハードディスク・ドライブ
202・・・時間計算ルーチン
204・・・差分変換用データの生成ルーチン
206・・・基準時刻のUT値
208・・・中間データ
210・・・有効範囲
106・・・RAM
108・・・ハードディスク・ドライブ
202・・・時間計算ルーチン
204・・・差分変換用データの生成ルーチン
206・・・基準時刻のUT値
208・・・中間データ
210・・・有効範囲
Claims (18)
- コンピュータの処理により、日時フォーマットを計算する方法であって、
基準時刻のUT値を取得するステップと、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算するステップと、
変換対象UT値と前記基準時刻のUT値の差を計算するステップと、
前記UT値の差の値に基づき、時分秒の値を計算するステップと、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成するステップを有する、
方法。 - 予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得するステップと、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直すステップを更に有する、請求項1に記載の方法。 - 前記予め定めた条件が日の切り替わりである、請求項2に記載の方法。
- 前記中間データが、tm構造体のデータ構造をもつ、請求項1に記載の方法。
- 前記基準時刻のUT値として、同日0時0分のUT値がセットされる、請求項3に記載の方法。
- 基準時刻の有効範囲として、下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒がセットされ、前記予め定めた条件が、前記変換対象UT値が、前記下限値と前記上限値の間にないことである、請求項5に記載の方法。
- 時間が所定の値であることに応答して、翌日分の前記中間データと、前記有効範囲を予め計算して保存しておくステップを更に有する、請求項3に記載の方法。
- コンピュータの処理により、日時フォーマットを計算するプログラムであって、
前記コンピュータに、
基準時刻のUT値を取得するステップと、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算するステップと、
変換対象UT値と前記基準時刻のUT値の差を計算するステップと、
前記UT値の差の値に基づき、時分秒の値を計算するステップと、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成するステップを実行させる、
プログラム。 - 予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得するステップと、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直すステップを更に前記コンピュータに実行させる、請求項8に記載のプログラム。 - 前記予め定めた条件が日の切り替わりである、請求項9に記載のプログラム。
- 前記中間データが、tm構造体のデータ構造をもつ、請求項8に記載のプログラム。
- 前記基準時刻のUT値として、同日0時0分のUT値がセットされる、請求項10に記載のプログラム。
- 基準時刻の有効範囲として、下限値 = 同日0時0分のUT値、上限値 = 下限値 + 24 * 3600秒がセットされ、前記予め定めた条件が、前記変換対象UT値が、前記下限値と前記上限値の間にないことである、請求項12に記載のプログラム。
- 時間が所定の値であることに応答して、翌日分の前記中間データと、前記有効範囲を予め計算して保存しておくステップを更に前記コンピュータに実行させる、請求項10に記載のプログラム。
- コンピュータの処理により、日時フォーマットを計算するシステムであって、
基準時刻のUT値を取得する手段と、
前記基準時刻のUT値から、年月日時分秒を含む中間データを計算する手段と、
変換対象UT値と前記基準時刻のUT値の差を計算する手段と、
前記UT値の差の値に基づき、時分秒の値を計算する手段と、
前記中間データと前記時分秒の値を組み合わせて、年月日時分秒をあらわす文字列フォーマットを生成する手段を有する、
システム。 - 予め定めた条件が成立することに応答して、新たに基準時刻のUT値を取得する手段と、
前記新たに取得した基準時刻のUT値から、年月日時分秒を含む中間データを計算し直す手段を更に有する、請求項15に記載のシステム。 - 前記予め定めた条件が日の切り替わりである、請求項16に記載のシステム。
- 前記中間データが、tm構造体のデータ構造をもつ、請求項15に記載のシステム。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012195544A JP2014052747A (ja) | 2012-09-05 | 2012-09-05 | 日時フォーマットの生成方法、プログラム及びシステム |
US14/019,080 US9646011B2 (en) | 2012-09-05 | 2013-09-05 | Date and time format generation method, program, and system for reference and elapsed timestamps to produce a formatted target timestamp for use in stream processing |
US14/043,491 US9665579B2 (en) | 2012-09-05 | 2013-10-01 | Date and time format generation method, program, and system for reference and elapsed timestamps to produce a formatted target timestamp for use in stream processing |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012195544A JP2014052747A (ja) | 2012-09-05 | 2012-09-05 | 日時フォーマットの生成方法、プログラム及びシステム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2014052747A true JP2014052747A (ja) | 2014-03-20 |
Family
ID=50188942
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012195544A Pending JP2014052747A (ja) | 2012-09-05 | 2012-09-05 | 日時フォーマットの生成方法、プログラム及びシステム |
Country Status (2)
Country | Link |
---|---|
US (2) | US9646011B2 (ja) |
JP (1) | JP2014052747A (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688517B (zh) * | 2017-08-30 | 2021-01-22 | 广州视源电子科技股份有限公司 | Wpf程序卡顿检测方法和装置 |
CN113205329B (zh) * | 2021-06-09 | 2024-07-19 | 中国银行股份有限公司 | 基于分布式支付平台系统的定时切日方法及装置 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH07152735A (ja) | 1993-11-29 | 1995-06-16 | Fuji Xerox Co Ltd | 時間データ処理装置 |
US6643664B1 (en) * | 1999-09-17 | 2003-11-04 | International Business Machines Corporation | Data conversions solving time limitations of object-oriented software programs |
JP3837284B2 (ja) | 2000-10-31 | 2006-10-25 | 三洋電機株式会社 | 時差対応システム |
EP1315069A3 (en) * | 2001-11-21 | 2009-11-25 | Automsoft R & D Limited | Date and time processing in computers |
US7930573B2 (en) * | 2007-09-18 | 2011-04-19 | International Business Machines Corporation | Workload apportionment according to mean and variance |
JP4645720B2 (ja) * | 2008-09-30 | 2011-03-09 | ブラザー工業株式会社 | 電子機器 |
CA2691023C (en) * | 2010-01-26 | 2017-01-03 | Ruggedcom Inc. | Time format conversion method, device and system |
US8984168B2 (en) * | 2011-03-31 | 2015-03-17 | Microsoft Technology Licensing, Llc | Relative timestamp when real time clock is unavailable |
US8578200B2 (en) * | 2011-04-14 | 2013-11-05 | International Business Machines Corporation | Conversion of timestamps between multiple entities within a computing system |
US9892172B2 (en) * | 2013-03-15 | 2018-02-13 | Dropbox, Inc. | Date and time handling |
-
2012
- 2012-09-05 JP JP2012195544A patent/JP2014052747A/ja active Pending
-
2013
- 2013-09-05 US US14/019,080 patent/US9646011B2/en not_active Expired - Fee Related
- 2013-10-01 US US14/043,491 patent/US9665579B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
US9665579B2 (en) | 2017-05-30 |
US9646011B2 (en) | 2017-05-09 |
US20140067876A1 (en) | 2014-03-06 |
US20140068616A1 (en) | 2014-03-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3244312B1 (en) | A personal digital assistant | |
CN109815028A (zh) | 数据同步的系统、方法、装置和计算机存储介质 | |
CN107241380B (zh) | 用于基于时间调整的负载均衡的方法和设备 | |
US8577959B2 (en) | Managing recurring appointments | |
US11016650B1 (en) | Building data metric objects through user interactions with data marks of displayed visual representations of data sources | |
US11514090B2 (en) | Comments-ordering method, apparatus, device and computer storage medium | |
CN112395483A (zh) | 基于树形结构的页面渲染方法及装置 | |
CN107450903A (zh) | 一种信息处理方法及装置 | |
EP3378017A1 (en) | Automatic extraction of tasks associated with communications | |
US20150149232A1 (en) | Method and system for scheduling an event at a computing device | |
CN109792403A (zh) | 联网消息传递系统中的时移通信 | |
JP6185488B2 (ja) | 公開カレンダーからの可用性情報の引き出し | |
CN115185434A (zh) | 一种车辆应用场景处理方法、装置、设备和存储介质 | |
CN113535364A (zh) | 任务调度方法及装置 | |
CN112988123A (zh) | 面向ddd的软件设计方法及系统 | |
CN104598554B (zh) | 网页页面加载方法及装置 | |
JP2014052747A (ja) | 日時フォーマットの生成方法、プログラム及びシステム | |
WO2018163520A1 (ja) | センサのメタデータ生成装置、センサのメタデータ生成システム、センサのメタデータ生成方法及びセンサのメタデータ生成プログラム | |
CN115170700A (zh) | 基于Flutter框架实现CSS动画的方法、计算机设备及存储介质 | |
US20180218332A1 (en) | Categorized time designation on calendars | |
JP5651873B2 (ja) | 操作支援方法及び計算機 | |
CN111597255A (zh) | 数据灾备处理方法、装置、电子设备及存储介质 | |
US10296190B2 (en) | Spatially organizing communications | |
CN117150074B (zh) | 交易流程视频生成方法、装置、设备及介质 | |
US11023260B2 (en) | Systems and methods for transforming operation of applications |