HP OpenVMS
HP OpenVMS
HP C ランタイム・ライブラリ・
リファレンス・マニュアル (上巻)
11.2 日付/時刻関数の概要
UTC ベースのモデルでは,時刻は Epoch 以降の秒数として表現されます。 Epoch は UTC の 1970 年 1 月 1 日 0 時,0 分, 0 秒という時刻として定義されます。 Epoch 以降の秒数は,指定された時刻から Epoch までの秒数として解釈される値です。
time関数と
ftime関数は, Epoch からの秒数として時刻を返します。
ctime,
gmtime,
localtime関数は, Epoch からの秒数として時刻を表現する時刻値を引数として受け付けます。
mktime関数は,ローカル時刻として表現されている年月日時分秒形式の時刻を, Epoch からの秒数を表す時刻値に変換します。
stat関数と
fstat関数から
stat構造体に返される値
st_ctime,
st_atime,
st_mtimeも UTC として表されます。
OpenVMS Version 7.0 で新たに導入された時刻サポートには,関数
tzset,
gettimeofday,
getclockと,外部変数
tzname,
timezone,
daylightが含まれています。
UTC ベースの時刻モデルを使用すると, HP C RTL で次のことが可能になります。
- ANSI C の
gmtime関数を実装できます。この関数は GMT 時刻として構造体を返します。
-
tm構造体の ANSI
tm_isdstフィールドを指定することができます。このフィールドは,夏時刻が有効かどうかを指定します。
- 時刻関連の POSIX および X/Open 拡張機能を提供できます ( たとえば,
tzset関数 ( 任意のタイム・ゾーンから時刻情報を取得する関数 ) や外部変数
tzname,
timezone,
daylightなど)。
- 過去のローカル時刻を正確に計算することができます。この機能は,
localtimeなどの時刻関数で必要になります。
- 機能テスト・マクロ ( 第 1.5 節 を参照 ) を使用することにより,
localtimeと
gmtimeは, 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 からローカル時刻を計算するために,ローカル・タイム・ゾーン変換規則を使用します。
- HP C RTL は UTC 表現で時刻を内部的に計算します。
- 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)));
}
|
この例の説明:
-
time関数を呼び出して, Epoch からの秒数として現在の時刻 (UTC) を取得します。
- この値を
localtime関数に渡します。その関数は,
tzsetによって指定された時刻変換情報を使用して, UTC からローカル時刻を計算するためにどのタイム・ゾーン変換規則を使用するのかを判断します。デフォルト設定では,これらの規則は SYS$LOCALTIME によって定義されるファイルに指定されています。
- 米国東部地区のユーザがローカル時刻を求めたいとすると,インストール時に SYS$LOCALTIME を SYS$COMMON:[SYS$ZONEINFO.US]EASTERN に設定されています。これは,米国東部のタイム・ゾーンの変換規則が格納されているタイム・ゾーン・ファイルです。
- ローカル時刻で夏時刻 (DST) が採用されている場合は, SYS$COMMON:[SYS$ZONEINFO.US]EASTERN は, - 4 時間の時差係数を UTC に適用してローカル規則を求めなければならないことを示します。
ローカル時刻が東部標準時 (EST) の場合は, SYS$COMMON:[SYS$ZONEINFO.US]EASTERN は, - 5 時間の時差係数を UTC に適用してローカル時間を求めなければならないことを示します。
- HP C RTL は - 4 (DST) または - 5 (EST) を UTC に適用し,
localtimeは
tm構造体としてローカル時刻を返します。
- この
tm構造体を
asctime関数に渡して,判読可能な形式でローカル時刻をプリントします。
第 12 章
シンボリック・リンクと POSIX パス名のサポート
V8.3 以降の OpenVMS では, Open Group 準拠のシンボリック・リンクと, POSIX 準拠のパス名がサポートされています。このサポートは, OpenVMS へ UNIX/LINUX のアプリケーションを移植する場合や, UNIX スタイルの開発環境を使用してアプリケーションを開発する場合に,その移植に伴っていた複雑さや開発コストの負担を軽減するために拡張されたものです。
OpenVMS では,シンボリック・リンクと POSIX パス名の処理をサポートするために,以下の機能を提供しています。
- C ランタイム・ライブラリ (C RTL) に,Open Group 準拠のシンボリック・リンク関数
symlink,
readlink,
unlink,
realpath,
lchown,および
lstatが追加されています ( 第 12.3.3 項 を参照)。
-
creat,
open,
delete,および
removeなどの既存の C RTL 関数が, Open Group のシンボリック・リンク仕様に従って動作するようになっています ( 第 12.3.4 項 を参照)。
- RMS が拡張されて,C RTL に上記の関数が実装できるようになりました。 SYS$OPEN,SYS$CREATE,SYS$PARSE,および SYS$SEARCH などの RMS ルーチンで,シンボリック・リンクをサポートできるようになっています ( 第 12.4 節 を参照)。
- OpenVMS でファイルを検索したりそのパスをたどったりしているときにシンボリック・リンクが検出されると,その内容が POSIX のパス名として解釈されるようになりました。 OpenVMS の C RTL と RMS のインタフェースで POSIX のパス名が使用できるようになっています ( 第 12.1.2 項 を参照)。
-
C RTL に新しい機能論理名 DECC$POSIX_COMPLIANT_PATHNAMES が追加されて,アプリケーションが POSIX 準拠モードで動作することを指示できるようになっています。ただし,POSIX 準拠モードで参照できるのは,最新バージョンのファイルだけです。同じファイルの複数のバージョンにアクセスすることはできません ( 第 12.3.1 項 を参照)。
- シンボリック・リンクの作成には,DCL コマンド CREATE/SYMLINK を使用します (
第 12.2.1 項 を参照)。
- システムの POSIX ルートを作成するには,DCL コマンド SET ROOT を使用します ( 第 12.5 節 を参照)。
- マウント・ポイントを設定するために,2 つの GNV ユーティリティ
mntと
umntが用意されています ( 第 12.7 節 を参照)。
- DCL コマンドおよびユーティリティが変更されて,シンボリック・リンクの操作や,シンボリック・リンクを検出した場合の処理が適切に行えるようになっています ( 第 12.9 節 を参照)。
- TCP/IP Services for for OpenVMS Network File System (NFS) のクライアントとサーバが拡張されて,ODS5 ボリューム上でシンボリック・リンクをサポートできるようになっています。
-
ln(シンボリック・リンクの作成) や
ls(シンボリック・リンクの内容の表示) などの関連 GNV ユーティリティがアップデートされて,シンボリック・リンクのアクセスと管理が行えるようになっています (
12.2.2 と 12.10 を参照)。
12.1 POSIX パス名とファイル名
POSIX のパス名は, 0 個以上のファイル名が
/(パス区切り文字) で区切られた,空でない文字列から構成されています。使用するパス区切り文字は,パス名の先頭や末尾に置くことも,ファイル名とファイル名の間に置くこともできます。また,2 個以上の区切り文字を連続して置くこともできます。ただし,どの区切り文字も 1 文字として扱われます。
POSIX のファイル名には,
/(パス区切り文字) と NUL (多くの API で文字列の終了文字として使用される) を除く,すべての ASCII 文字が使用できます (ただし,現在の OpenVMS システムには,POSIX ファイル名に
?文字と
*文字も含めてはならないという制限があります)。ファイル名は,パス名の構成要素またはパス名のコンポーネントとも呼ばれます。
12.1.1 POSIX パス名の解釈
先頭が
/で始まっているパス名は,絶対パス名として扱われ,その処理は, POSIX
ルートとして指定されているデバイスおよびディレクトリから開始されます (ルートの定義方法は, 第 12.5 節 を参照してください)。
先頭が
/で始まっていないパス名は相対パス名として扱われ,その処理は現在の作業ディレクトリから開始されます。
OpenVMS で現在の作業ディレクトリがどのように解釈されるかについては, 第 12.6 節 を参照してください。
12.1.1.1 POSIX ルート・ディレクトリ
POSIX ルート・ディレクトリは,絶対パス名を解決する際に使用されるディレクトリです。
ルート・ディレクトリは,ディレクトリ階層の一番上にあるノードで,自分自身が自分の親ディレクトリにもなっています。つまり,ルート・ディレクトリのパス名は
/で,その親ディレクトリのパス名も
/です。
OpenVMS における POSIX ルートの定義については, 第 12.5 節 を参照してください。