Next: タイムゾーンのルール, Previous: ユーザーの識別, Up: オペレーティングシステムのインターフェース [Contents][Index]
このセクションではカレント時刻とタイムゾーンを決定する方法を説明します。
current-time
やfile-attributes
のような多くの関数は秒をカウントするLispタイムスタンプ(Lisp
timestamp)値をリターンします。この値は1970-01-01 00:00:00
UTCというエポック(epoch)からの経過秒数をカウントすることにより絶対時刻を表すことができます。
伝統的なLispタイムスタンプが整数のペアであったとしても、それらの形式は進化しており、プログラムは通常はカレントのデフォルト形式に依存するべきではありません。プログラムに特定のタイムスタンプ形式が必要なら、time-convert
関数を使用して必要とする形式に変換できます。時刻の変換を参照してください。
現在のところ3つのLispタイムスタンプ形式があり、それぞれが秒数を表します:
(ticks . hz)
(
hzは正)。これはticks/hz秒を表し、hzが1なら単なるticksと同時刻。hzにたいして一般的な値はナノ秒解像度クロック用の100000000028。
(high low micro pico)
(0≤low<65536、0≤micro<1000000、0≤pico<1000000)。これは次式を使用して秒数を表す:
high * 2**16 + low + micro * 10**-6 + pico *
10**-12。
一部の関数がデフォルトでmicroおよびpicoを0に省略した2つ、または3つの要素のリストをリターンする場合があるかもしれない。現在のすべてのマシンではpicoは1000の倍数だが、より高精度のクロックが利用可能になったらこれは変更されるかもしれない。
関数の引数(current-time-string
のtime引数)には、より一般的なtime値(time
value)のフォーマット(Lispタイムスタンプ、カレント時刻にたいするnil
、秒にたいする単精度浮動小数点数、欠落要素を0に切り詰めたタイムスタンプリスト(high
low micro)
)が許されています。
time値は暦形式や他形式に相互に変換できます。これらの変換のいくつかは利用可能なtime値範囲を制限するオペレーティングシステム関数に依存しており、その制限を超えると‘"Specified
time is not
representable"’のようなエラーをシグナルします。たとえばあるシステムでは1970年や1901年より前のタイムスタンプ、あるいは遠い将来の年をサポートしないかもしれません。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"
この関数はカレント時刻をLispタイムスタンプとしてリターンする。Emacsのカレントリリースにおいてタイムスタンプが(high
low micro
pico)
という形式であったとしても、Emacsの将来のバージョンにおいて変更される予定である。タイムスタンプを他の形式に変換するためにtime-convert
関数を使うことができる。時刻の変換を参照のこと。
この関数はエポックからの経過秒数を浮動小数点数としてリターンする。オプション引数time-valueが与えられた場合には、カレント時刻ではなく変換する時刻を指定する。
警告:
結果は浮動小数点数なので正確ではないかもしれない。正確なタイムスタンプが必要なら使用しないこと。たとえば典型的なシステムにおいては(float-time
'(1 . 10))
を‘0.1’と表示するが、これは1/10より若干大きい。
time-to-seconds
はこの関数のエイリアス。
現在のところ標準的な関数にタイムスタンプを渡す際の互換性に関する警告を避けるために、hzには少なくとも65536が必要です(以前のバージョンのEmacsではそのようなタイムスタンプは後方互換性を考慮して解釈していたため)。これらの警告はEmacsの将来のバージョンで削除される予定です。