Next: タイムゾーンのルール, Previous: ユーザーの識別, Up: オペレーティングシステムのインターフェース [Contents][Index]
このセクションではカレント時刻とタイムゾーンを決定する方法を説明します。
current-time
やfile-attributes
のような多くの関数は秒をカウントするLispタイムスタンプ(Lisp
timestamp)値をリターンします。この値は1970-01-01 00:00:00 UTC(Coordinated Universal Time:
協定世界時)というエポック(epoch)からの経過秒数をカウントすることにより絶対時刻を表すことができます。通常これらのカウントは閏秒(leap
seconds)を無視します。ただしGNUや一部のオペレーティングシステムでは閏秒をカウントするように構成できます。
伝統的なLispタイムスタンプが整数のペアであったとしても、それらの形式は進化しており、プログラムは通常はカレントのデフォルト形式に依存するべきではありません。プログラムに特定のタイムスタンプ形式が必要なら、time-convert
関数を使用して必要とする形式に変換できます。時刻の変換を参照してください。
現在のところ3つのLispタイムスタンプ形式があり、それぞれが秒数を表します:
(ticks . hz)
(
hzは正)。これはticks/hz秒を表し、hzが1なら単なるticksと同時刻。hzにたいして一般的な値はナノ秒解像度クロック用の1000000000。
(high low micro pico)
(0≤low<65536、0≤micro<1000000、0≤pico<1000000)。これは次式を使用して秒数を表す:
high * 2**16 + low + micro * 10**-6 + pico *
10**-12。
current-time-list
がt
の場合には、一部の関数がデフォルトでmicroおよびpicoを0に省略した2つ、または3つの要素のリストをリターンする場合があるかもしれない。現在のすべてのマシンではpicoは1000の倍数だが、より高精度のクロックが利用可能になったらこれは変更されるかもしれない。
関数の引数(format-time-string
のtime引数)には、より一般的なtime値(time
value)のフォーマット(Lispタイムスタンプ、カレント時刻にたいするnil
、秒にたいする有限浮動小数点数、欠落要素を0に切り詰めたタイムスタンプリスト(high
low micro)
)が許されています。
time値は暦形式や他形式に相互に変換できます。これらの変換のいくつかは利用可能なtime値範囲を制限するオペレーティングシステム関数に依存しており、その制限を超えると‘"Specified
time is not
representable"’のようなエラーをシグナルします。たとえばあるシステムではエポック以前のタイムスタンプ、あるいは遠い将来の年をサポートしないかもしれません。format-time-string
を使用して可読性のある文字列、time-convert
を使用してLispタイムスタンプ、decode-time
やfloat-time
を使用して別の形式にtime値を変換できます。これらの関数については以降のセクションで説明します。
この関数はカレントの時刻と日付を可読形式の文字列でリターンする。この文字列の先頭部分には曜日、月、日付、時刻がこの順に含まれて、それらが可変長となることはない。これらのフィールドにたいして使用される文字数は常に同じとはいえ、年は正確に4桁とはかぎらず、いつかの将来に終端に追加情報が追加されるかもしれないので、current-time-string
の出力からフィールドを抽出するよりformat-time-string
を使うほうが通常は便利です。
引数timeが与えられたら、それはカレント時刻のかわりにフォーマットする時刻を指定する。オプション引数zoneのデフォルトはカレントのタイムゾーンルール。タイムゾーンのルールを参照のこと。timeの範囲およびzoneの値はオペレーティングシステムが制限する。
(current-time-string) ⇒ "Fri Nov 1 15:59:49 2019"
これは移行支援用のブーリーン変数である。t
ならcurrent-time
や関連する関数は(high
low micro pico)
)、それ以外なら(ticks
.
hz)
という形式を用いてタイムスタンプをリターンする。現在のところ以前のバージョンのEmacsの挙動と互換性をとるために、この変数のデフォルトはt
になっている。この変数のデフォルトはEmacsの将来のバージョンではnil
となり、その後いくつかのバージョンを経た後に削除されるので、開発者はこの変数をnil
にセットしてタイムスタンプ関連のコードをテストするようお勧めする。
この関数はカレント時刻をLispタイムスタンプとしてリターンする。current-time-list
がnil
ならタイムスタンプの形式は(ticks
. hz)
(ticksはクロックチックカウント、hzは1秒当たりのクロックチック)、それ以外の場合にはタイムスタンプは(high
low usec
psec)
という形式のリスト。current-time-list
の値に関わらず特定の形式を得るには(time-convert
nil t)
や(time-convert nil 'list)
を使うことができる。時刻の変換を参照のこと。
この関数はエポックからの経過秒数を浮動小数点数としてリターンする。オプション引数time-valueが与えられた場合には、カレント時刻ではなく変換する時刻を指定する。
警告:
結果は浮動小数点数なので正確ではないかもしれない。正確なタイムスタンプが必要なら使用しないこと。たとえば典型的なシステムにおいては(float-time
'(1 . 10))
を‘0.1’と表示するが、これは1/10より若干大きい。
time-to-seconds
はこの関数のエイリアス。
カレントCPU時間を解像度とともにリターンする。値は(CPU-TICKS
. TICKS-PER-SEC)
のようなペアーとしてリターンされる。CPU-TICKSカウンターはラップアラウンド(wrap
around: 最後に達したら最初に戻る)するかもしれないので、時間が経過し過ぎると値の比較は無意味になるだろう。