TRON時間

TRON時間

[5] 1.9 時計管理, , http://www.chokanji.com/developer/doc/btron3/os_spec/kernel/clk.html#aco

システム時間はグリニッチ標準時 GMT (Greenwich Mean Time) の 1985年1月1日 00:00 からの秒数で表わされた32ビットの値であり、 ファイルの生成 / 更新 / アクセス日時等のシステム内部の時間表現として使用される。

システム時間に対して、 マシンが実際に存在する地域の時間をローカル時間と呼ぶ。 時計管理機能ではシステム時間とローカル時間との時差を保持し、 ローカル時間での日付時刻の取出し / 設定機能も提供している。

adjust はローカル時間とシステム時間 ( GMT ) との時差であり、グリニッチから西方向への秒単位で表現される、 - (12 × 60 × 60) ~ + (12 × 60 × 60) の範囲の値である。

dst_flg はサマータイム ( Daylight Saving Time, DST ) の適用タイプを示し 0 は適用しないことを示す。 0 以外の値は適用することを示すが、 その意味は時計管理機能では関知せず、 単に 0 か 0 でないかの判断のみを行なっている。

dst_adj は DST による時間の調整時間 ( 分 ) を示す - (12×60) ~ + (12×60) の値である。 時計管理機能では DST が適用されるか否かの判断は行なわず、 システムプログラムが DST が実際に適用される期間の開始時に、 dst_adj を適当な値に設定し、 DST が適用される期間の終了時に、dst_adj を 0 に設定することを想定している。

	typedef struct {
		W	d_year;	  /* 1990年からのオフセット(85~) */
		W	d_month;  /* 月 ( 1 ~ 12, 0) */
		W	d_day;	  /* 日 ( 1 ~ 31 ) */
		W	d_hour;	  /* 時 ( 0 ~ 23 ) */
		W	d_min;	  /* 分 ( 0 ~ 59 ) */
		W	d_sec;	  /* 秒 ( 0 ~ 59 ) */
		W	d_week;	  /* 週 ( 1 ~ 54 ) */
		W	d_wday;	  /* 曜日 ( 0 ~ 6, 0が日曜) */
		W	d_days;	  /* 日 ( 1 ~ 366 ) */
	} DATE_TIM;

d_week は、 その年の1月1日の週を1とした場合の週の数を意味し、 d_days は、 その年の1月1日を1とした場合の日数を意味する。 また、d_month = 0 は、 特殊な意味として使用される。

[6] 「1990年から」とあるのは「1900年から」 (西暦1900年暦) の誤り?

[9] >>6 他の箇所では1900年になってる

[7] 年の週

[8] 年内通日

[10] T-Kernel 2.0 Extension仕様書 (TEF020-S009-02.00.00/ja) - TEF020-S009-02.00.00_ja.pdf, , https://www.tron.org/ja/wp-content/themes/dp-magjam/pdf/specifications/ja/TEF020-S009-02.00.00_ja.pdf#page=19

□ファイルの日時指定

ファイルのメタデータには、最終アクセス時刻、最終更新時刻、最終状態変更時刻が含まれる。これらの時刻を扱 う API では、time_t 型に加え、SYSTIM および SYSTIM_U 型を扱える API も提供する。 ただし、ファイルシステムの種類により、ファイル状態に関する時刻の正確な意味および精度には違いがある。

例:

・最終アクセス時刻、最終更新時刻、最終状態変更時刻の全てを保持していないものがある。

・時刻の精度がファイルシステムにより異なる。

FAT ファイルシステムでは、時刻の解像度は、更新時刻 2秒、アクセス時刻 1日である。最終状態変更時刻は存在 せず、最終更新時刻と同じと見なす。

[1] T2EX () http://www.tron.org/ja/wp-content/themes/dp-magjam/pdf/specifications/ja/TEF020-S009-02.00.00_ja.pdf#page=106

time_t

time_t 型は、POSIX において使われている時間を秒数単位であらわす整数データ型でカレンダ時刻と呼ぶ。

time_t 型で時刻を表現する際は、UTC で 1970年1月1日0時からの通算秒数とする。

この通算秒数の開始時刻(UTC で1970年1月1日0時)をエポックと呼ぶ。 カレンダ時刻およびシステム時刻と文字列表現および要素別時刻との相互変換には、time_t, SYSTIM, SYSTIM_U 型の 全ての型に対応したAPIコールを提供する。

struct tm

カレンダ時刻を要素別に表す構造体 struct tm を、以下のように定義する。 T2EX 固有の構造体メンバとして tm_usecを加え、ミリ秒・マイクロ秒レベルの時刻も情報として含めることがで きる。

#include <t2ex/datetime.h>
struct tm {
int tm_usec; /* マイクロ秒 [0,999999] */
int tm_sec; /* 秒 [0,60] */
int tm_min; /* 分 [0,59] */
int tm_hour; /* 時間 [0,23]*/
int tm_mday; /* 月内の通算日 [1,31] */
int tm_mon; /* 月 [0,11] */
int tm_year; /* 1900年からの年数 */
int tm_wday; /* 曜日 [0,6] (0が日曜) */
int tm_yday; /* 年内通算日 [0,365] */
int tm_isdst; /* 夏時間 (正: 夏時間、0: 夏時間ではない、負: 不明) */
};

タイムゾーン

タイムゾーンとは、協定世界時(UTC)からのある一定の時差を、その地域の標準時として使用している地域全体の ことを 指し、時間帯とも言う。

構造体 struct tzinfo は、そのタイムゾーンで使われている時間(ローカル時刻)をUTCからの差分で表す構造体で ある。

#define TZNAME_MAX 8 /* タイムゾーン名の最大文字数 */
struct tzinfo {
char tzname[2][TZNAME_MAX+1]; /* タイムゾーンの名前 */
long offset; /* UTC からのオフセット秒数(西向きを正
とする) */
int daylight; /* サマータイム */
/* 以下はサマータイム固有情報(daylight > 0 の場合のみ有効) */
long dst_offset; /* サマータイム期間中のUTCからのオフセ
ット秒数 */
union dsttimespec dst_start; /* サマータイム開始日時 */
union dsttimespec dst_end; /* サマータイム終了日時 */
};

daylight 正の場合サマータイムがある 0 の場合サマータイムがない

dst_start, dst_end サマータイム実施期間を示す。 dsttimespec 共用体は以下の通り定義される。

union dsttimespec {
uint32_t v;
struct julian {
unsigned int type: 2, /* ローカル時刻の1月1日0:00:00からの通
算秒数による指定 (値は 0 または 1) */
int offset: 30, /* 通算秒数 [0,31622400] */
} j;
struct monthweekday {
unsigned int type: 2, /* 月・週数・日数を用いた指定(値は2)
*/
unsigned int m: 4, /* 月 [1,12] */
unsigned int n: 4, /* 週数 [1,5] */
unsigned int d: 4, /* 日数 [0,6] */
int offset: 18, /* 秒 [0,86400] */
} m;
};

ローカル時間の1月1日0:00:00からの通算秒数による指定では、type = 0 の場合は通常の通算秒数とし、 type = 1 の場合にはうるう日を数えない通算秒数を示す。後者では2月29日を明示的に参照することは できない。

月・週数・日数を用いた指定(type = 2)では、ローカル時間における、年内の m 月の第 n 週の第 d 番 目の日の 0:00:00 から offset 秒経過した日時が指定される。

システムタイムゾーン

システムで唯一つ持っている現在のタイムゾーンをシステムタイムゾーンと呼ぶ。 これは、協定世界時(UTC)に対する時差を規定しているため、現在実行中のシステムのローカルな時刻を表現でき る。 通常、システム起動時に dt_setsystz により、現在地域のタイムゾーンをシステムタイムゾーンとして設定す る。 設定前の、システムタイムゾーンの初期値は実装依存とするが、T2EXリファレンス実装では、UTCとなっている。

タイムゾーン(tzinfo)のメモリーアドレスを指定する API コールにおいて、struct tzinfo * として NULL が指 定された 場合、システムタイムゾーンが使われる。

ローカル時刻

タイムゾーンで規定されるその地域の時刻を、協定世界時(UTC)に対してそのタイムゾーンのローカル時刻と呼 ぶ。 単にローカル時刻と言う場合、システムタイムゾーンのローカルな時刻を意味する。 タイムゾーン文字列 タイムゾーン文字列は、タイムゾーン情報を文字列で表現したもので以下のどちらかの形式を持つ:

1. :characters

':' で始まる文字列の場合 characters は実装依存 T2EXリファレンス実装では、この形式のタイムゾーン文字列はサポートしない。 dt_tzset() API コールで指定した場合は、エラーとなる。

2. std offset dst offset, rule

std 標準の名前

dst 代替の名前

offset 協定世界時(UTC)を得るためにローカル時刻に加えられる値

hh[:mm[:ss]] の形式を持つ

hh 時間 [0,24]

mm 分 [0,59]

ss 秒 [0,59]

std には offset が必要である。

dst の後の offset は省略することが出来る。dst 後の offset が省略された場合は、 std の offset の一時間前とみなす。

タイムゾーン文字列が '-' で始まる場合、グリニッジ子午線の東側であることを意味する。

西側に対しては、オプションで'+'を付けても良い。

rule 代替時間と変更する時間または戻る時間を示す。以下の形式を持つ:

date[/time],date[/time]

最初の date は、標準から代替時間にいつ変更するかを示す。

次の date は代替時間から標準時間にいつ戻るかを示す。

各 time フィールドは、別の時間への変更が行われる時をローカル時刻で示す。

date は以下の形式を持つ:

Jn ユリウス日 n (1<=n<=365)。うるう日は数えてはならない。 うるう年を含む全ての年で、2月28日は、n=59 で、3月1日は n=60 となる。 2月29日を明示的に参照することはできない。

n 0ベースのユリウス日(0<=n<=365)。うるう日は数えられ、 2月29日を参照できる。

Mm.n.d 年の m 月の n 週の d 番目の日(1<=m<=12, 1<=n<=5, 0<=d<=6)。 n = 1 は、d番目の日が起きる最初の週である。d = 0 が日曜日を表す。

time は、符号('+' または '-')が付かない点を除き offset と同じ形式である。 time が省略された場合は 02:00:00 とみなす。

タイムゾーン文字列の例:

- UTC から時差があり、夏時間も採用しているニュージーランドの場合:

"NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"

標準の名前 NZST(ニュージーランド標準時) 時差 -12時間 (UTCより12時間進んでいる) 代替の名前 NZDT(ニュージーランド夏時間) 時差 -13時間 (UTCより13時間進んでいる) 代替に切り替わる日付 10月第1日曜日 代替から戻る日付 3月の第3日曜日

- 日本の場合:

"JST-9"

名前は JST のみで代替の名前は無い。 UTC より9時間進んでいるだけで、夏時間は無い。

システムロケール

ロケールは、日付や時刻の表現形式、文字照合順序、数値の表現形式、通貨記号等の各カテゴリ毎に国や地域に応 じた 振る舞いを規定するものである。 T2EX では、ロケールを動的に自由に設定する機能は持たず、固定したデフォルトのロケールを使用する。 これをシステムロケールと呼ぶ。 システムロケールは通常、T2EX を搭載した機器を使用する国や地域、あるいは利用目的に応じて、 カテゴリ毎にシステム構成時にカスタマイズした固定値を用いるものとする。 T2EXリファレンス実装では、システムロケールは ISO C ロケール ("C") となっている。 したがって、エラーメッセージの取得APIコールでは、英語のASCII文字列が戻され、また時刻を文字列表現に変換 した 場合も、月や曜日は英語の文字列が戻される。

6.3 API

dt_setsystz, dt_getsystz の 2 関数のみシステムコールとして実装され、残りの関数はライブラリ関数として実 装される。

6.3.1 dt_main - カレンダ機能の初期化・終了

6.3.2 dt_setsystz - システムタイムゾーンの設定

6.3.3 dt_getsystz - システムタイムゾーンの取得

6.3.4 dt_tzset - タイムゾーン構造体の初期化

6.3.5 dt_localtime, dt_localtime_ms, dt_localtime_us - ローカル時刻への変換

6.3.6 dt_strftime - 日付と時刻の文字列への変換

6.3.7 dt_strptime - 文字列の日付および時刻への変換

6.3.8 dt_mktime, dt_mktime_ms, dt_mktime_us - システム時刻への変換

6.3.9 dt_gmtime, dt_gmtime_ms, dt_gmtime_us - UTC 時刻への変換

[13] T-Kernel 2.0 Extension仕様書 (TEF020-S009-02.00.00/ja) - TEF020-S009-02.00.00_ja.pdf, , https://www.tron.org/ja/wp-content/themes/dp-magjam/pdf/specifications/ja/TEF020-S009-02.00.00_ja.pdf#page=255

time.h

[11] 2桁年号境界: 68 - 69 >>1

[12] 週暦

>>5, >>1 は1月第1日曜日からを第1週とするもの

>>1 は1月第1木曜日のある月曜日からを第1週とするもの (ISO週暦相当)

[2] T-Kernel 2.0 Extension(T2EX) () http://www.tron.org/download/index.php?route=information/information&information_id=75

タイムスタンプを扱うAPIでは、POSIX仕様の時刻データ形式の他にT-Kernel 2.0の時刻データ形式(SYSTIM, SYSTIM_U)を使えるAPIを追加

[3] エポック ‐ 通信用語の基礎知識 () https://www.wdic.org/w/SCI/%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF

TRON時間 ‐ 1985年1月1日00:00:00(UTC)

[4] 第4章 フロッピーディスク形式, , http://www.chokanji.com/developer/doc/btron3/shared_data/fd_format.html#afd

最新のシステムブロックの更新日時:

システムブロックの最新の更新日時であり、 1985年1月1日0時0分0秒 (GMT) からの秒数で示される。

ファイルシステムの生成日時:

ファイルシステムの生成日時であり、1985年1月1日0時0分0秒 (GMT) からの秒数で示される。

[14] 超漢字, , https://web.archive.org/web/20021204020607/http://www.personal-media.co.jp/software/2000/ck.html

[16] 1B/V2, , https://web.archive.org/web/20021104001707/http://www.personal-media.co.jp/software/2000/1bv2.html

[15] 1B/V3, , https://web.archive.org/web/20021104002300/http://www.personal-media.co.jp/software/2000/1bv3.html

[17] B-right/V, , https://web.archive.org/web/20021104002600/http://www.personal-media.co.jp/software/2000/brightv.html