getdate()、getdate64() - ユーザー形式の日時の変換

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3
Language Environment®

両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <time.h>

struct tm *getdate(const char *string);

extern int getdate_err;
#define _LARGE_TIME_API
#include <time.h>

struct tm *getdate64(const char *string);

機能説明

getdate() 関数は、string で示される日付または時刻 (あるいは日付と時刻の両方) の指定を tm 構造体へ変換します。tm 構造体の宣言は、ヘッダー <time.h> 内にあります。

テンプレートは、入力ストリングを解析および解釈するのに使用されます。テンプレートは、プロセスによって作成されたテキスト・ファイル内にあり、環境変数 DATEMSK を介して識別されます。DATEMSK 変数は、テンプレートを含むファイルの完全パス名を示す ため、設定されます。入力指定と一致するテンプレートの最初の行は、内部時間形式への 解釈および変換するために使用されます。

以下のフィールド記述子がサポートされます。
%%
% と同じ。
%a
曜日の省略名。
%A
曜日のフル名。
%b
月の省略名。
%B
月のフル名。
%c
ロケールの適切な日時表現。
%C
世紀数 [00,99]; 先行ゼロを設定することはできるが、必須ではない。%y と連結して使用される
%d
日 (01 ~ 31、先行 0 はオプション)。
%D
%m/%d/%y となる日付。
%e
%d と同じ。
%h
%b と同じ。
%H
時間 (00 ~ 23、先行 0 はオプション)。
%I
時間 (01 ~ 12、先行 0 はオプション)。
%m
月 (00 ~ 11、先行 0 はオプション)。
%M
分 (00 ~ 59、先行 0 はオプション)。
%n
¥n と同じ。
%p
AM または PM でのロケールの同値。
%r
ロケールの 12 時間表示。POSIX ロケールでは、これは %I:%M:%S %p と同じ。
%R
%H:%M で示す時間。
%S
秒 [00,60]。範囲は 60 (59 で止まるのではなく) までで、 正のうるう秒を表現することができます。うるう秒はどのアルゴリズムでも想定されていないため、 うるう秒データは外部ソースから取り入れる必要があります。
%t
¥t (tab) と同じ。
%T
%H:%M:%S で示す時間。
%w
曜日 (0 ~ 6、0 は日曜日を示す)。
%x
ロケールの日付表示。POSIX ロケールでは、これは %m/%d/%y と同じ。
%X
ロケールの時間表現。POSIX ロケールでは、これは %H:%M:%S と同じ。
%y
世紀内の年。 世紀が指定されていない場合、69 ~ 99 の範囲の値は、20 世紀 (1969 ~ 1999 まで) を指す。00 ~ 68 の範囲の値は、21 世紀 (2000 ~ 2068 まで) を指す。31 ビットは 00 ~ 37 の範囲の値をサポートし、64 ビットは 00 ~ 68 の範囲の値をサポートします。
%Y

ccyy での年 (1969-9999)。

31 ビット: %Y の上限は 2037。

64 ビット: %Y の上限は 9999。

%Z
時間帯名、または、時間帯が存在しない場合は文字はない。%Z で 指定されている時間帯が getdate() の期待する時間帯でない場合、無効な 入力指定エラーになる。getdate() 関数は、提供された日時情報を基に、期待する時間帯を計算する。

テンプレートと getdate() が実行する入力仕様との突き合わせでは、大文字小文字を区別しません。

月名と曜日名は、大文字と小文字の組み合わせから構成できます。プロセスは、LC_TIME カテゴリー (setlocale() を参照) を 設定することにより、入力日時指定を特定の言語で表すことを要求することができます。

先行 0 が許可されている記述子でも先行 0 は必要ではありませんが、先行 0 がある場合、先行 0 を 含めて 2 桁以下にする必要があります。テンプレート・ファイルまたは string のいずれかにある余分な空白文字は無視されます。

フィールド記述子 %c、%x、および %X は、これらがサポートされないフィ ールド記述子を含む場合は、サポートされません。

以下の規則は、入力指定を tm 構造体へ変換するのに適用されます。
  • 曜日のみ指定された場合、指定日が現行の日と等しいと今日であると 仮定され、現行の日よりも小さいと次の週であると仮定されます。
  • 月のみ指定された場合、指定月が現行の月と等しいと、現行の月で あると仮定され、現行の月よりも小さく、かつ年が指定されないと、次の年であ ると仮定されます (日が指定されないと、月の最初の日であると仮定されます)。
  • 時間、分、秒が指定されないと、現行の時間、分、および秒であると 仮定されます。
  • 日付が指定されない場合、指定時間が現行の時間よりも大きいと今日 であると仮定され、現行の時間よりも小さいと明日であると仮定されます。
注 :
  1. 入力指定を tm 構造体に変換する場合、getdate() 関数は、上記のリストで示されているように、欠落したフィールドに現行の時刻と日付の値を仮定します。この関数は、時間帯データのカスタマイズに基づいて、これらの値を現地時間として扱います。
  2. TZ (POSIX) 環境変数も _TZ (非 POSIX) 環境変数も定義されない場合、時間帯情報について現行ロケールの値が照会されます。TZ も _TZ も定義されず、LC_TOD 時間帯情報が現行ロケールに存在しない場合、デフォルト値が現地時間に適用されます。POSIX プログラムでは単にデフォルトで協定世界時 (UTC) になりますが、非 POSIX プログラムでは、システム・クロックの設定に基づいて UTC からのオフセットを確立します。 現地時間を処理するための時間帯のカスタマイズについて詳しくは、「z/OS XL C/C++ プログラミング・ガイド」の『時間帯のカスタマイズ』を参照してください。

テンプレート・ファイル内のフィールド記述子が、サポートされているフィールド記述子の 1 つでない場合、その記述子が検出されると次の動作が生じます。

  1. ASCII アプリケーションでは、それは無視され (不一致として扱われ)、処理は次のテンプレートに進みます。
  2. EBCDIC アプリケーションでは、それにより関数が正常に戻されず、getdate_err が値 8 に設定されます。

関数 getdate64() は getdate() とまったく同じように動作しますが、ストリングで示される定義可能な日付または時刻指定を、2038 年 1 月 19 日の 03:14:07 UTC を超え、9999 年 12 月 31 日の 23:59:59 UTC までを限度とするカレンダー時間の tm 構造体に変換できます。

戻り値

正常に実行された場合、getdate() は tm 構造体へのポインターを戻します。

正常に実行されなかった場合、getdate() は、NULL ポインターが戻され、外部変数 getdate_err にエラーを示す値が設定されます。

getdate() がポインターを戻す tm 構造体は、他のどの関数とも 共用されません。また、getdate() 関数は、その上でそれが実行するスレッドに固有な tm 構造体を作成します。

C/370™ では、すべてのスレッド間で共用される書き込み可能な 静的ストレージ内に getdate_err 外部変数用のストレージが 割り振られます (これはすべての外部変数に当てはまります)。したがって、getdate_err は、本質的に「スレッド・セーフ」ではありません。

C/370 は、getdate_err の類似を基にスレッドごとにストレージを割り振 ります。__gderr() 関数はこのストレージへのポインターを戻します。getdate() が正常に実行されなかった理由をスレッド・セーフ方法で決定するために getdate() が NULL ポインターを戻す場合、マルチスレッド・アプリケーション や DLL から実行しているアプリケーションでは、getdate_err ではなく __gderr() 関数を使用することをお勧めします。

__gderr() は以下のように定義されます。
#include <time.h>

int *__gderr(void);
__gderr() 関数は、getdate_err のスレッド固有の値へのポイ ンターを戻します。getdate64() 関数は、getdate() 関数と同じく、getdate_err のスレッド固有値へのポインターに影響を与えます。
以下は getdate_err 設定値とその説明のリストです。
1
DATEMSK 環境変数が NULL であるか、または未定義である。
2
テンプレート・ファイルを読み取り用にオープンできない。
3
ファイル状況情報を得るのに失敗した。
4
テンプレート・ファイルが通常のファイルでない。
5
テンプレート・ファイルの読み取り中に、エラーが検出された。
6
メモリーの割り振りに失敗した (十分なメモリーが使用可能でない)。
7
テンプレート・ファイル内のどの行も、入力指定と一致しない。
8
無効な入力指定。例えば、2 月 31 日、あるいは time_t (エポック (1970 年 1 月 1 日の真夜中 (UTC)) から数えた秒数を示す)で表現できない時刻。
9
現在時刻を決定することができない。
注: この値は、z/OS®UNIX サービスに固有です。

関連情報