mktime()、mktime64() - 現地時間の変換

標準

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

ISO C
POSIX.1
XPG4
XPG4.2
C99
Single UNIX Specification、バージョン 3
Language Environment®

両方  

形式

#include <time.h>

time_t mktime(struct tm *tmptr);
#define _LARGE_TIME_API
#include <time.h>

time64_t mktime64 (struct tm *tmptr);
コンパイル要件: mktime64() 関数を使用するには、long long データ型が必要です。long long データ型を使用可能にする方法について詳しくは、「z/OS XL C/C++ ランゲージ・リファレンス」を参照してください。

機能説明

mktime() 関数は、tmptr が指す tm 構造体 (表 1 で説明) で 現地時間として表されるブロークンダウン時間を、カレンダー時間に変換します。 カレンダー時間とは、エポック (協定世界時 (UTC) 1970 年 1 月 1 日 00:00:00) から数えた秒数です。

mktime() 関数に渡される構造体メンバーの値 は、『time.h』に記載されている範囲の 制限を受けません。指定された範囲外の値の場合、mktime() 関数は、日付計算を使用して値を調整し、有効な日時を生成します (を参照)。 tm_wdaytm_yday の値は 無視され、戻りでこれらの正しい値が割り当てられます。

この関数が正常終了すると、time がポイントしている構造体の すべてのメンバーは、エポックからの指定された時間を表すように設定され、その際、それらの値は、 time.h に記述されている範囲に入るようにされ ます。tm_wday の値は、 tm_mon の値と tm_year の値が決定された後で設定されます。tm_isdst の 出力値は、mktime() 関数への入力として示された値には関係なく、mktime() 関数によって決定され ます。

アプリケーションが現地時間を判別するのに localtime() 関数を 使用した場合、localtime() 関数は夏時間 (DST 情報が使用できること を想定) を適用するかどうかを判別し、tm_isdst フラグ を正しく設定します。アプリケーションで localtime() 関数が 戻す tm 構造体に対応するエポックからの秒数を判別する場合は、localtime() 関数が設定した tm_isdst フラグを 変更しないでください。

アプリケーションが tm_isdst を 0 に設定した後で mktime() 関数を呼び出す場合、 そのアプリケーションは、システム DST の開始日付および終了日付にかかわらず、夏時間調整が tm 構造体の入力値に 適用されないことを表明しています。同様に、アプリケーションが tm_isdst に 0 より大きい 値を設定している場合は、tm 構造体で表示されている時間が 夏時間用にシフトしたことを表明しています。そのため、mktime() 関数はエポックから数えた秒数で時間をシフトしません。

tm_isdst を -1 に設定すると、mktime() 関数により 夏時間 (DST) が適用されるかどうかの判別が行われます。その場合、mktime() 関数は 0 より大きい tm_isdst を戻します。そうでない場合は、DST 情報がシステムで使用できない場合を除いて、この関数は tm_isdst に 0 を戻します。DST 情報がシステムで使用できない 場合、tm_isdst に -1 を戻します。

TZ 環境変数が夏時間名を指定していない、あるいは DSTNAME が現行の LC_TOD ロケール・カテゴリー で指定されていないため、時間帯で DST が使用されていない可能性があります。このような場合、tm_isdst=1 を コード化して mktime() 関数を呼び出すと、エラーを示す (time-t)-1 が戻されます。

mktime64() 関数は、mktime() 関数とまったく同じように動作します。ただし、2038 年 1 月 1 日の 00:00:00 UTC を超え、9999 年 12 月 31 日の 23:59:59 UTC を限度として構成された日付をサポートする点を除きます。

戻り値

mktime() 関数は、正常終了した場合、エポック以降の秒数を表す time_t を 戻します。この秒数は、tmptr でポイントされるユーザー指定の tm 構造体 に基づいて現地時間として表された、要素に分解された時刻に 対応します。

mktime() 関数がブロークンダウン時間をカレンダー時間に 変換できない場合、例えば 1970 年 1 月 1 日 (UTC) 以前の時間の場合、エラーを示す (time_t)-1 が戻されます。

エラー・コード
説明
EOVERFLOW
結果は表されません。

使用上の注意

  1. 関数 ctime()、localtime()、および mktime() は、timezone_name 変数の設定を含むカスタマイズされたロケール情報 が使用可能でない限り、協定世界時 (UTC) を戻すことになりました。
  2. 現地時間を処理するアプリケーションは、TZ (POSIX) または _TZ (非 POSIX) 環境変数を使用するか、使用中のロケールの LC_TOD カテゴリーをカスタマイズして、時間帯情報を定義することができます。
  3. TZ も _TZ も定義されない場合、時間帯情報について現行ロケールの値が照会されます。TZ も _TZ も定義されず、LC_TOD 時間帯情報が現行ロケールに存在しない場合、デフォルト値が現地時間に適用されます。POSIX プログラムでは単にデフォルトで協定世界時 (UTC) になりますが、非 POSIX プログラムでは、システム・クロックの設定に基づいて UTC からのオフセットを確立します。 現地時間を処理するための時間帯のカスタマイズについて詳しくは、「z/OS XL C/C++ プログラミング・ガイド」の『時間帯のカスタマイズ』を参照してください。
  4. mktime() 関数が失敗するのは、結果が time_t オブジェクト (tmptr の時間からさかのぼって、標準エポックの開始までの経過秒数を戻すのに使用される) の制限を超える場合です。 31 ビットでは、mktime() がサポートする最後の年は、2037 年です。64 ビットでは、time_t の長さは 4 バイトから 8 バイトになり、これによって mktime() がもっと先の日付まで対応できるようになります。 64 ビットにおける上限は、西暦 9999 です。

CELEBM19
⁄* CELEBM19
                                      
   This example prints the day of the week that is 40 days and                  
   16 hours from the current date.                                              

 *⁄                                                                             
#include <stdio.h>                                                              
#include <time.h>                                                               
                                                                                
char *wday[] = { "Sunday", "Monday", "Tuesday", "Wednesday",                    
                 "Thursday", "Friday", "Saturday" };                            
                                                                                
int main(void)                                                                  
{                                                                               
  time_t t1, t3;                                                                
  struct tm *t2;                                                                
                                                                                
  t1 = time(NULL);                                                              
  t2 = localtime(&t1);                                                          
  t2 -> tm_mday += 40;                                                          
  t2 -> tm_hour += 16;                                                          
  t3 = mktime(t2);                                                              
                                                                                
  printf("40 days and 16 hours from now, it will be a %s ¥n",                   
          wday[t2 -> tm_wday]);                                                 
}                                                                               
出力:
40 days and 16 hours from now, it will be a Sunday

関連情報