OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)


前へ 次へ 目次 索引



第 11 章
日付/時刻関数

この章では, HP C for OpenVMS Systems で提供される日付/時刻関数について説明します。各関数の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」を参照してください。

表 11-1 日付/時刻関数
関数 説明
asctime localtime から返された年月日時分秒形式の時刻を 26 文字の文字列に変換する。
ctime 1970 年 1 月 1 日 00:00:00 からの秒数で表した経過時間を, asctime 関数で生成される形式の ASCII 文字列に変換する。
ftime 1970 年 1 月 1 日 00:00:00 からの経過時間を引数によって示される構造体に返す。
getclock システム単位のクロックの現在の値を取得する。
gettimeofday 日付と時刻を取得する。
gmtime 時間単位を GMT (グリニッジ標準時) に変換する。
localtime 時間 (1970 年 1 月 1 日 00:00:00 からの秒数で表した経過時間) を時,分,秒などに変換する。
mktime ローカル時刻構造体を暦の時刻値に変換する。
time 1970 年 1 月 1 日 00:00:00 から経過した時間を秒数で返す。
tzset タイム・ゾーン変換を設定し,アクセスする。

また, fstatおよび statから返される時刻関連情報では, 第 11.1 節 で説明している新しい日付/時刻モデルが使用されます。

11.1 日付/時刻のサポート・モデル

OpenVMS バージョン 7.0 以降, HP C RTL では日付/時刻サポート・モデルがローカル時刻ベースのモデルから UTC (協定世界時) ベースのモデルに変更されました。この結果,以前はインプリメントすることができなかった ANSI C/POSIX 機能を HP C RTL でインプリメントすることができるようになりました。 UTC 時刻ベースのモデルを導入したことで, HP C RTL は Tru64 UNIX の時刻関数の動作とも互換性を保持することができるようになりました。

デフォルト設定では,新たにコンパイルされるプログラムは UTC ベースの日付/時刻ルーチンへのエントリ・ポイントを生成します。

バージョン 7.0 より前のバージョンの OpenVMS システムとの互換性を維持するために,以前のバージョンでコンパイルされていて, OpenVMS バージョン 7.0 システムで再リンクされるプログラムは,ローカル時刻ベースの日付/時刻のサポートを保持します。再リンクだけでは UTC のサポートにアクセスできません。

_DECC_V4_SOURCE機能テスト・マクロと _VMS_V6_SOURCE機能テスト・マクロを定義してプログラムをコンパイルした場合も,ローカル時刻ベースのエントリ・ポイントが有効になります。つまり,新しい OpenVMS バージョン 7.0 の日付/時刻関数は有効になりません。

UTC ベースのエントリ・ポイントとローカル時刻ベースのエントリ・ポイントの両方を備えている関数は次のとおりです。


ctime           mktime 
fstat           stat 
ftime           strftime 
gmtime          time 
localtime       wcsftime 

注意

UTC ベースの日付/時刻モデルが導入された結果,UTC をサポートする時刻関連関数は,ローカル時刻ベースの日付/時刻モデルの場合のようにメモリ内で単純な演算を行うのではなく,タイム・ゾーン・ファイルを読み込んで解釈する必要があるため,性能がある程度低下します。

この性能低下を緩和するために, OpenVMS バージョン 7.1 以降のバージョンでは,タイム・ゾーン・ファイルを格納したプロセス単位のキャッシュを保持することができるようになりました。キャッシュのサイズ (つまり,メモリ内のファイルの数) は, DECC$TZ_CACHE_SIZE 論理名の値によって決定されます。デフォルト値は 2 です。

タイム・ゾーン・ファイルはかなり小さいため ( 各ファイルは約 3 ブロック ),アプリケーションで使用するタイム・ゾーンの最大数になるように DECC$TZ_CACHE_SIZE を定義することを検討してください。たとえば,デフォルトのキャッシュ・サイズは,実行時にタイム・ゾーンを切り換えないアプリケーションに適しており, TZ環境変数が標準タイム・ゾーンと夏時刻タイム・ゾーンの両方で定義されているシステムで動作するアプリケーションに適しています。

11.2 日付/時刻関数の概要

UTC ベースのモデルでは,時刻は Epoch 以降の秒数として表現されます。 Epoch は UTC の 1970 年 1 月 1 日 0 時,0 分, 0 秒という時刻として定義されます。 Epoch 以降の秒数は,指定された時刻から Epoch までの秒数として解釈される値です。

time関数と ftime関数は, Epoch からの秒数として時刻を返します。

ctimegmtimelocaltime関数は, Epoch からの秒数として時刻を表現する時刻値を引数として受け付けます。

mktime関数は,ローカル時刻として表現されている年月日時分秒形式の時刻を, Epoch からの秒数を表す時刻値に変換します。

stat関数と fstat関数から stat構造体に返される値 st_ctimest_atimest_mtimeも UTC として表されます。

OpenVMS バージョン 7.0 で新たに導入された時刻サポートには,関数 tzsetgettimeofdaygetclockと,外部変数 tznametimezonedaylightが含まれています。

UTC ベースの時刻モデルを使用すると, HP C RTL で次のことが可能になります。

11.3 HP C RTL の日付/時刻の演算---UTC 時刻とローカル時刻

UTC (協定世界時) は,時刻を表すための国際標準です。 UTC 標準時刻では,0 時はグリニッジ標準時の午前 0 時に相当します。 UTC はローカル時刻と異なり,常に増大するという利点があります。ローカル時刻は夏時刻の設定に応じて進んだり,遅れたりする可能性があります。

また,UTC には次の 2 つの追加コンポーネントがあります。

OpenVMS バージョン 7.0 以降のバージョンで HP C RTL 時刻サポートが正しく動作するには,次のことに注意する必要があります。

詳細については, OpenVMS System Manager's Manual: Essentials で,異なるタイム・ゾーンに対して補正するためのシステムの設定に関するセクションを参照してください。

HP C RTL では,次に示すように, UTC からローカル時刻を計算するために,ローカル・タイム・ゾーン変換規則を使用します。

  1. HP C RTL は UTC 表現で時刻を内部的に計算します。

  2. HP C RTL はタイム・ゾーン変換規則を使用して,ローカル時刻を求めるために UTC に適用される時差係数を計算します。タイム・ゾーン変換規則の詳細については,本書の「リファレンス・セクション」の tzset関数を参照してください。

デフォルト設定では, UTC からローカル時刻を計算するために使用されるタイム・ゾーン変換規則は, SYS$LOCALTIME および SYS$POSIXRULES システム論理名によって定義されるタイム・ゾーン・ファイルに指定されています。これらの論理名は OpenVMS のインストール時に,システムの時刻をローカル時刻に最適に近似するためのタイム・ゾーン・ファイルを示すように設定されます。

SYS$POSIXRULES は SYS$LOCALTIME と同じでも構いません。詳細については, tzset関数を参照してください。

11.4 タイム・ゾーン変換規則ファイル

SYS$LOCALTIME 論理名と SYS$POSIXRULES 論理名によって示されるタイム・ゾーン・ファイルは, OpenVMS バージョン 7.0 以降のバージョンのシステムにインストールされるパブリック・ドメインのタイム・ゾーン・サポート・パッケージの一部です。

このサポート・パッケージには,全世界のタイム・ゾーンのローカル時刻を UTC から計算するためのタイム・ゾーン変換規則を記述した一連のソース・ファイルが含まれています。 OpenVMS バージョン 7.0 以降のバージョンのシステムでは, ZIC というタイム・ゾーン・コンパイラが提供されます。ZIC コンパイラは,タイム・ゾーン・ソース・ファイルをバイナリ・ファイルにコンパイルします。 HP C RTL はこのバイナリ・ファイルを読み込んで,タイム・ゾーン変換指定を取得します。これらのソース・ファイルの形式の詳細については, ZIC に関する OpenVMS システム・ドキュメンテーションを参照してください。

タイム・ゾーン・ファイルは次の編成になっています。

複数のタイム・ゾーン・ファイルの名前は,それらのファイルが表す地域名の省略形から作成されています。 表 11-2 はこれらの省略形を示しています。

表 11-2 タイム・ゾーン・ファイルのファイル名の省略形
タイム・ゾーンの省略形 説明
CET 中央ヨーロッパの時刻
EET 東ヨーロッパの時刻
Factory タイム・ゾーンがないことを指定する
GB-Eire 英国/アイルランド
GMT グリニッジ標準時
NZ ニュージーランド
NZ-CHAT ニュージーランド,チャタム諸島
MET 中央ヨーロッパの時刻
PRC 中華人民共和国
ROC 中華民国
ROK 大韓民国
SystemV System V オペレーティング・システム固有
UCT 協定世界時
US 米国
UTC 協定世界時
Universal 協定世界時
W-SU 中央ヨーロッパの時刻
WET 西ヨーロッパの時刻

独自のタイム・ゾーン規則を定義し,インプリメントするための機能が提供されています。詳細については,ZIC コンパイラに関する OpenVMS システムのドキュメンテーションと,『HP C ランタイム・ライブラリ・リファレンス・マニュアル (下巻)』「リファレンス・セクション」の tzsetの説明を参照してください。

また,SYS$LOCALTIME および SYS$POSIXRULES システム論理名は,ユーザ指定タイム・ゾーンに再定義することができます。

11.5 日付/時刻の例

次の例と説明は, HP C RTL の時刻関数を使用して現在の時刻をプリントする方法を示しています。


#include <stdio.h> 
#include <time.h> 
 
main () 
{ 
  time_t t; 
 
  t = time((time_t)0); 
  printf ("The current time is: %s\n",asctime (localtime (&t))); 
}  

この例の説明:

  1. time関数を呼び出して, Epoch からの秒数として現在の時刻 (UTC) を取得します。

  2. この値を localtime関数に渡します。その関数は, tzsetによって指定された時刻変換情報を使用して, UTC からローカル時刻を計算するためにどのタイム・ゾーン変換規則を使用するのかを判断します。デフォルト設定では,これらの規則は SYS$LOCALTIME によって定義されるファイルに指定されています。

    1. 米国東部地区のユーザがローカル時刻を求めたいとすると,インストール時に SYS$LOCALTIME を SYS$COMMON:[SYS$ZONEINFO.US]EASTERN に設定されています。これは,米国東部のタイム・ゾーンの変換規則が格納されているタイム・ゾーン・ファイルです。

    2. ローカル時刻で夏時刻 (DST) が採用されている場合は, SYS$COMMON:[SYS$ZONEINFO.US]EASTERN は, - 4 時間の時差係数を UTC に適用してローカル規則を求めなければならないことを示します。
      ローカル時刻が東部標準時 (EST) の場合は, SYS$COMMON:[SYS$ZONEINFO.US]EASTERN は, - 5 時間の時差係数を UTC に適用してローカル時間を求めなければならないことを示します。

    3. HP C RTL は - 4 (DST) または - 5 (EST) を UTC に適用し, localtimetm構造体としてローカル時刻を返します。

  3. この tm構造体を asctime関数に渡して,判読可能な形式でローカル時刻をプリントします。


前へ 次へ 目次 索引