時刻の扱い

システム・プログラム

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2004/2004-04-26 /time.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.is.tsukuba.ac.jp/~yas/index-j.html

■時刻の扱い

Unix では、カレンダーの時刻は、1970年1月1日0:00(UTC)からの秒数で表して いる。これを time_t (または clock_t )と表している。time_t の実体は、普 通、32ビットの整数である。

% egrep time_t /usr/include/bits/types.h  [←]
typedef long int __time_t;
% []

現在の時刻を取得するには、time() システム・コール(System V系)や gettimeofday() システム・コール (BSD系)を使う。

#include <time.h>
time_t time(time_t *t);

#include <sys/time.h>
#include <unistd.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);

その秒数からカレンダ的な日付と時刻の形式(struct tm)に変換するライブラ リ関数が、localtime() ライブラリ関数である。struct tm は、次のようなフィー ルドがある。

CTIME(3)            Linux Programmer's Manual            CTIME(3)

#include <time.h>
char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timep);
struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);
time_t mktime(struct tm *timeptr);
...
struct tm
{
	int     tm_sec;                 /* 秒 */
	int     tm_min;                 /* 分 */
	int     tm_hour;                /* 時間 */
	int     tm_mday;                /* 日 */
	int     tm_mon;                 /* 月 */
	int     tm_year;                /* 年 */
	int     tm_wday;                /* 曜日 */
	int     tm_yday;                /* 年内通算日 */
	int     tm_isdst;               /* 夏時間 */
};

ctime(), strftime() などを使うと、文字列に変換してくれる。逆に、struct tm から time_t を作る関数が mktime() ライブラリ関数である。

localtime() や mktime() は、TZ環境変数(Time Zone)を見ている。閏秒など が混じると単純には計算できない。TZ がセットされていない時、Linux の場 合、/etc/localtime というファイルにあるものが使われる。

% setenv LANG C [←]
% ls -l /etc/localtime [←]
-rw-r--r--    1 root     root           73 Feb  7  2002 /etc/localtime
% date [←]
Mon May 12 00:05:41 JST 2003
% setenv TZ EST [←]
% date [←]
Sun May 11 10:05:50 EST 2003
% ls -l /usr/share/zoneinfo/EST [←]
-rw-r--r--    6 root     root          286 Mar  6 09:07 /usr/share/zoneinfo/EST
% []
プログラムの中で Time Zone を変えることはあまりないが、変えるなら setenv() や putenv() で TZ 環境変数を変えて、tzset() ライブラリ関数を 呼ぶ。

◆get-time

   1:	/*
   2:	        get-time.c -- 現在の時刻を表示するプログラム
   3:	        ~yas/syspro/time/get-time.c
   4:	        Start: 1998/05/18 22:29:17
   5:	*/
   6:	
   7:	#include <time.h>       /* time(2) */
   8:	
   9:	/*
  10:	Linux:
  11:	/usr/include/bits/types.h
  12:	typedef long int __time_t;
  13:	
  14:	/usr/include/time.h:
  15:	typedef __time_t time_t;
  16:	extern time_t time (time_t *__timer) ;
  17:	*/
  18:	
  19:	main()
  20:	{
  21:	    time_t t ;
  22:	        t = 0 ;
  23:	        printf("%d: %s",t,ctime(&t) );
  24:	        t ++ ;
  25:	        printf("%d: %s",t,ctime(&t) );
  26:	        t = time( 0 );
  27:	        printf("%d: %s",t,ctime(&t) );
  28:	        t ++ ;
  29:	        printf("%d: %s",t,ctime(&t) );
  30:	}
実行例。
% cp ~yas/syspro/time/get-time.c . [←]
% make get-time [←]
cc     get-time.c   -o get-time
% ./get-time  [←]
0: Wed Dec 31 19:00:00 1969
1: Wed Dec 31 19:00:01 1969
1052670767: Sun May 11 11:32:47 2003
1052670768: Sun May 11 11:32:48 2003
% []

Last updated: 2004/04/26 02:11:17
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>