日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

HP 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 Version 7.0 以降, HP C RTL では日付/時刻サポート・モデルがローカル時刻ベースのモデルから UTC (協定世界時) ベースのモデルに変更されました。この結果,以前は実装することができなかった ANSI C/POSIX 機能を HP C RTL で実装することができるようになりました。 UTC 時刻ベースのモデルを導入したことで, HP C RTL は Tru64 UNIX の時刻関数の動作とも互換性を保持することができるようになりました。

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

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

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

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

ctime           mktime 
fstat           stat 
ftime           strftime 
gmtime          time 
localtime       wcsftime 

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

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

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



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 Version 7.0 で新たに導入された時刻サポートには,関数 tzsetgettimeofdaygetclockと,外部変数 tznametimezonedaylightが含まれています。

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

  • ANSI C の gmtime関数を実装できます。この関数は GMT 時刻として構造体を返します。

  • tm構造体の ANSI tm_isdstフィールドを指定することができます。このフィールドは,夏時刻が有効かどうかを指定します。

  • 時刻関連の POSIX および X/Open 拡張機能を提供できます ( たとえば, tzset関数 ( 任意のタイム・ゾーンから時刻情報を取得する関数 ) や外部変数 tznametimezonedaylightなど)。

  • 過去のローカル時刻を正確に計算することができます。この機能は, localtimeなどの時刻関数で必要になります。

  • 機能テスト・マクロ ( 第 1.4 節 を参照 ) を使用することにより, localtimegmtimeは, 2 つの追加フィールド, tm_zone( タイム・ゾーン名の省略形 ) と tm_gmtoff(秒数で表した UTC からのオフセット) を,これらの関数が返す tm構造体に返すことができます。



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

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

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

  • 誤差 (省略可能)。

  • 時差係数。各ローカル・タイム・ゾーンを UTC に関連付けます。
    時差係数はローカル時刻を求めるために UTC に適用されます ( ローカル時刻は,グリニッジ標準時の西側では最大 --12 時間,東側では +13 時間ずれる可能性があります)。

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

  • 正しい OpenVMS TDF を使用するように, OpenVMS システムを正しく構成する必要があります。正しく設定されているかどうかは, SYS$TIMEZONE_DIFFERENTIAL 論理名の値を調べることにより確認できます。この論理名には,ローカル時刻を求めるために UTC に加算される時差が格納されています。

  • OpenVMS のインストールで,デフォルトのローカル・タイム・ゾーンになる場所を記述するローカル・タイム・ゾーンを正しく設定する必要があります。一般に,これはシステムが動作しているローカル・タイム・ゾーンです。

詳細については, 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$LOCALTIME は, HP C RTL がローカル時刻を計算するために使用するデフォルトの変換規則を格納したタイム・ゾーン・ファイルを定義します。

  • SYS$POSIXRULES は,夏時刻への変更および標準時刻への変更の時期が指定されていない POSIX 形式のタイム・ゾーンに適用されるデフォルトの規則を指定するタイム・ゾーン・ファイルを定義します。

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

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

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

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

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

  • ルート・タイム・ゾーン・ディレクトリは SYS$COMMON:[SYS$TIMEZONE.SYSTEM] です。 SYS$TZDIR というシステム論理名がインストール時にこの領域を示すように設定されます。

  • タイム・ゾーン・ソース・ファイルは SYS$COMMON:[SYS$TIMEZONE.SYSTEM.SOURCES] にあります。

  • バイナリ・タイム・ゾーン・ファイルは,ルート・ディレクトリとして SYS$COMMON:[SYS$TIMEZONE.SYSTEM] を使用します。一部のバイナリ・ファイルはこのディレクトリにありますが,他のファイルはそのサブディレクトリにあります。

  • サブディレクトりにあるバイナリ・ファイルは,より大きな地理的領域の特定のタイム・ゾーンを表すタイム・ゾーン・ファイルです。たとえば,SYS$COMMON:[SYS$TIMEZONE.SYSTEM] には,米国用のサブディレクトリとカナダ用のサブディレクトリがあります。これらの各地域には複数のタイム・ゾーンがあるからです。米国内の各タイム・ゾーンは, United States サブディレクトリのタイム・ゾーン・ファイルによって表されます。カナダの各タイム・ゾーンは, Canada サブディレクトリ内のタイム・ゾーン・ファイルによって表されます。

複数のタイム・ゾーン・ファイルの名前は,それらのファイルが表す地域名の省略形から作成されています。 表 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関数に渡して,判読可能な形式でローカル時刻をプリントします。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.