次: , 前: Time of Day, 上: System Interface


37.6 時刻の変換

これらの関数は、時刻の値(2つか3つの整数から成るリスト)を 文字列や日時情報に変換します。 日時情報を時刻の値に変換する関数もあります。 時刻の値は、関数current-time(see Time of Day)や file-attributes(see File Attributes)で得られます。

多くのオペレーティングシステムでは、時刻の値を32ビットに制限しています。 これらのシステムでは、典型的には協定世界時1901年12月13日20:45:52から 2038年1月19日03:14:07までしか表現できません。 しかし、より大きな時刻の値を扱い、 より広い範囲の過去から未来を表現できるシステムもあります。

時刻変換関数は、グレゴリオ暦を導入するまえであっても つねにグレゴリオ暦を使います。 紀元前1年からの経過年数を数え、通常のグレゴリオ暦のように0年を飛ばしません。 たとえば、−37年は、グレゴリオ暦紀元前38年を表します。

— 機能: format-time-string format-string time

この関数は、timeformat-stringに従って文字列に変換する。 引数format-stringには、時刻のさまざまな部分で置き換えられる `%'列を含んでよい。 `%'列の意味を以下に示す。

`%a'
曜日の省略名を表す。
`%A'
曜日の(省略しない)名称を表す。
`%b'
月の省略名を表す。
`%B'
月の(省略しない)名称を表す。
`%c'
`%x %X'の同義語。
`%C'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%A, %B %e, %Y'と等価。
`%d'
ゼロでパディングした月内の日。
`%D'
`%m/%d/%y'の同義語。
`%e'
空白でパディングした月内の日。
`%h'
`%b'の同義語。
`%H'
時(00-23)を表す。
`%I'
時(00-12)を表す。
`%j'
年内の日(001-366)を表す。
`%k'
空白でパディングした時(0-23)を表す。
`%l'
空白でパディングした時(0-12)を表す。
`%m'
月(01-12)を表す。
`%M'
分(00-59)を表す。
`%n'
改行を表す。
`%p'
`AM'か`PM'の適切なほうを表す。
`%r'
`%I:%M:%S %p'の同義語。
`%R'
`%H:%M'の同義語。
`%S'
秒(00-60)を表す。
`%t'
タブ文字を表す。
`%T'
`%H:%M:%S'の同義語。
`%U'
日曜日を週の始まりと仮定した年内の週(01-52)を表す。
`%w'
数字で表した曜日(0-6)。 日曜日を0とする。
`%W'
月曜日を週の始まりと仮定した年内の週(01-52)を表す。
`%x'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%D'と等価。
`%X'
これにはローケル固有の意味がある。 デフォルトのローケル(`C')では、`%T'と等価。
`%y'
年の下2桁(00-99)を表す。
`%Y'
100年単位の年を表す。
`%Z'
時刻帯の省略名を表す。

これらの`%'列には、桁数やパディングの種類も指定できる。 printfと同様に動作し、 `%'列のあいだに桁数を数字で指定する。 桁数を`0'で始めるとゼロでパディングすることを意味する。 桁数を`_'で始めると空白でパディングすることを意味する。

たとえば、`%S'は分内の秒数を指定し、 `%03S'はゼロでパディングして3桁にすることを意味し、 `%_3S'は空白でパディングして3桁にすることを意味する。 `%S'は普通はパディングして2桁にするため、 `%3S'だけであるとゼロでパディングする。

— 機能: decode-time time

この関数は、時刻の値を日時情報に変換する。 戻り値は、つぎの9要素のリストである。

          (seconds minutes hour day month year dow dst zone)
     

各要素の意味はつぎのとおりである。

sec
0から59の整数で表した分内の秒数。
minute
0から59の整数で表した時内の分数。
hour
0から23の整数で表した日内の時。
day
1から31の整数で表した月内の日。
month
1から12の整数で表した年内の月。
year
年。 典型的には1900より大きい。
dow
日曜日を0とした0から6の整数で表した曜日。
dst
夏時間制が有効であるとt、さもなければnil
zone
グリニッジから東周りではかった時刻帯を表す秒数。

Common Lispに関した注意: Common Lispでは、dowzoneの意味が異なる。

— 機能: encode-time seconds minutes hour day month year &optional ...zone

この関数はdecode-timeの逆である。 7項目から成る日時情報を時刻の値に変換する。 引数の意味については、上記decode-timeの一覧を参照。

100未満の年は普通の年として扱う。 それらを1900年代として扱いたい場合には、 encode-timeを呼び出すまえに修正しておくこと。

省略可能な引数zoneのデフォルトは、 現在の時刻帯とその夏時間制の規則である。 指定する場合には、(current-time-zoneで得られるような)リストであるか、 環境変数TZと同じ形式の文字列であるか、 (decode-timeで得られるような)整数であること。 指定した時刻帯は、夏時間の補正をせずに使われる。

encode-timeに7引数より多く渡すと、 始めの6つをsecondsからyearまでに、 最後の引数をzoneに使い、そのあいだの引数は無視する。 この機能は、decode-timeが返したリストの要素を つぎのようにしてencode-timeの引数に使うことを可能にする。

          (apply 'encode-time (decode-time ...))
     

引数secminutehourdaymonthの 値が範囲外になるようにすると単純な日時演算を行える。 たとえば、0日はその月のまえの日を意味する。

オペレーティングは可能な時刻の値の範囲を制限する。 その範囲を越える時刻を符号化しようとするとエラーになる。