02.1日付と時刻を得る(TIMEとTOD時計)

By 神居 - Posted: 2008/11/16 Last updated: 2009/12/04 - Leave a Comment

現在の日付と時刻を得る

TIMEマクロは現在の日付と時刻を求めます。DECが基本的な返答形式で、GR0に時刻をHHMMSSTH(時分秒)で返します。Tは1/10秒、Hは1/100秒を示します。他にもいくつかの形式がありますので必要に応じて使い分けます。日付はGR1にパック10進数0CYYDDDFで返ります。Cは世紀を表す数字で21世紀(2000?2099年)は1です。2008年なら1900年を起点に108年と見ればよいわけです。DDDは1月1日からの通算日付でジュリアンDATEと呼ばれます。Fはパック10進数の符号です。
日付/時刻を得るための基本的なAPIですが、日付を月日で得られないためプログラム側でYYDDD形式をYYMMDD形式に変換する必要があります。
MSPではDATE=YMD、VOS3ではDTYPE=YMDを指定すれば日付は CYYMMDDF の形式で返されます。


現在の日付と時刻を得る(新形式)

MVSでのみ有効な新形式のTIMEマクロです。現時刻と日付はレジスターではなく指定した16バイトの領域に符号無しパック10進数で返されます。時刻は1/100秒未満も返され、MIJUはそれぞれ1/1000、1/10000、1/100000、1/1000000秒に対応します。
マクロ名は同じTIMEですが、LINKAGEパラメーターで新旧形式が区別されます。


TOD時計

TOD時計(TOD Clock)はハードウェアのタイマー機構の1つです。実際の時刻を示し、すべてのCPUで共用されます。
TOD時計は64ビットの2進数カウンターで、ビット51が1マイクロ秒(1/1000000秒)を示します。1マイクロ秒毎にビット51に1が加算されます。1マイクロ秒未満のビット52?63はハードウェア性能によって分解能が変わるため時刻表示には使われません。しかしどのモデルであってもビット51は正しく1マイクロ秒毎に加算されるように設定されます。またビット31は1.048576秒毎に加算されます。ほぼ1秒です。そのためプログラムによってはTOD時計の先頭ワードのみを参照すれば、現在の日付と時刻を得るのに十分な精度が得られます。


0から51までのすべてのビットが1になるまで約143年掛かります。S/370アーキテクチャーではTODのスタート時刻は1900年1月1日午前0時O分0秒ちょうどになっています。まだ35年も先ですが、2043年にはTOD時計は一周して0に戻ってしまいます。

STCKはCPU命令です。現在のTOD時計の値をダブルワードの領域に格納します。STCKEはSTCKの拡張版で、ESA/390アーキテクチャー以降104ビットに拡張されたTOD時計の値を16バイトの領域に格納します。104ビットに拡張されたTOD時計も先頭のビット0?ビット51までは同じです。ビット51は1マイクロ秒を示します。将来の新CPUモデルでは2043年にTOD時計が一周してビット0が繰り上がると、STCKE命令で格納される先頭バイトに格納されるようになっています。プログラムは引き続き1900年を起点にする標準エポックで計時が可能になります。2043年以降も使われるプログラムを作るならSTCKE命令による拡張されたTOD時計のフォーマットと返答領域について知っておく必要があります。現時点で2043年以降のTOD時計について技術情報が公開されているのはIBM社のzアーキテクチャーだけです。

TOD時計の値はTIMEマクロでも得ることは可能ですが、わざわざAPIコールをする必要はありません。STCK命令で直接求められます。

TOD時計の値はそのままではただの2進数カウンターに過ぎないので、表示に使う場合はYYYYMMDDとHHMMSS形式に変換する必要があります。「OS/390アセンブラーハンドブック」でもTOD時計値の変換方法を解説していますが、現在では自作する必要はなく、クロック値を変換するサービスが用意されています。MVSではSTCKCONV、MSPではTIMECNVTの各マクロ命令で呼び出すことができます。VOS3には同等サービスがありません。MVSのSTCKCONVはSTCKVALに代えSTCKEVALパラメーターを使えば拡張TOD時計値をサポートしますので、2043年以降もプログラム修正の必要がありません。

TIMEマクロを使うかSTCK命令を使うかはプログラムデザイン次第ですが、日付や秒程度の分解能でかまわない時刻であればTIMEマクロが手軽です。デバッグや性能測定のためのログ情報などであれば1/100秒程度ではメインフレームの場合分解能が低すぎるので1/1000000秒まで測定できるTOD時計値が適しています。頻繁に現時刻を取得するならSTCK,STCKEはただの機械命令ですからパフォーマンス面では軍配が上がりますが、将来性を考えてSTCKEを使用すると格納領域長が16バイト必要になります。

Posted in .基礎編 • • Top Of Page