このセクションでは、現在の時刻とタイムゾーンを確認する方法について説明します。
current-time や file-attributes といった多くの関数は、秒数をカウントする Lisp タイムスタンプ 値を返します。これは、1970-01-01 00:00:00 UTC(協定世界時)の エポック
からの経過秒数をカウントすることで、絶対時間を表現できます。通常、これらのカウントでは閏秒は無視されますが、GNU
やその他の一部のオペレーティングシステムでは、閏秒をカウントするように設定することが可能です。
従来、Lispのタイムスタンプは整数のペアでしたが、その形式は変遷しており、通常、プログラムが現在のデフォルト形式に依存すべきではありません。プログラムで特定のタイムスタンプ形式が必要な場合は、time-convert関数を使用して必要な形式に変換できます。時刻変換を参照してください。
現在、Lispのタイムスタンプには3つの形式があり、それぞれが秒数を表しています:
(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 の場合、一部の関数はデフォルトで2要素または3要素のリストを返すことがあり、省略された micro および pico の要素はデフォルトで 0
となる。現在のすべてのマシンにおいて pico は 1000
の倍数であるが、より高分解能なクロックが利用可能になるにつれて変更される可能性がある。
関数の引数(例えば format-time-string の time 引数)は、より汎用的な 時刻値
形式を受け付けます。これには、Lisp のタイムスタンプ、現在時刻を表す nil、秒単位の有限浮動小数点数、あるいは、欠落した要素を 0
とみなした切り詰め済みリストタイムスタンプであるリスト (high
low micro) または (high low)
が含まれます。
時刻値は、暦形式やその他の形式との間で相互に変換可能です。これらの変換の一部は、取り得る時刻値の範囲を制限するオペレーティングシステムの機能に依存しており、その制限を超えた場合には
‘"Specified time is not
representable"’
のようなエラーを通知します。例えば、システムがエポック以前のタイムスタンプや、遥か未来の年をサポートしていない場合があります。時刻値は、format-time-string を用いて人間が読み取り可能な文字列に、time-convert を用いて Lisp タイムスタンプに、そして decode-time および float-time
を用いてその他の形式に変換できます。これらの関数については、以降のセクションで説明します。
この関数は、現在時刻と日付を人間が読み取り可能な文字列として返します。文字列の冒頭部分の形式は一定で、曜日、月、日、時刻の順に並びます。これらのフィールドに使用される文字数は常に同じですが、(ロケールに関わらず英語の曜日や月の略称が必要な場合を除き)、年が必ずしも正確に4桁になるとは限らず、また将来的に末尾に情報が追加される可能性もあるため、current-time-string の出力からフィールドを抽出するよりも、format-time-string を使用する方が通常は便利です。
引数 time を指定すると、現在時刻ではなく書式設定に使用する時刻を指定できます。オプション引数 zone は、デフォルトで現在のタイムゾーン規則が適用されます。タイムゾーン規則 を参照してください。オペレーティングシステムにより、時刻およびゾーン値の範囲が制限されています。
(current-time-string)
⇒ "Fri Nov 1 15:59:49 2019"
このブール変数は移行支援用のものです。nil(デフォルト)、current-timeおよび関連関数は、(ticks . hz)形式でタイムスタンプを返します。tの場合、これらの関数は以前のEmacsバージョンとの互換性を保つため、通常は(high low micro pico)のようなリスト形式で返します。あくまで移行支援用のものであるため、この変数は将来のEmacsバージョンで削除される予定です。
この関数は、現在時刻を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 を指定した場合は、現在時刻の代わりに変換対象の時刻を指定します。
警告:
結果は浮動小数点数となるため、厳密な値にならない場合があります。正確なタイムスタンプが必要な場合は、この関数を使用しないでください。例えば、一般的なシステムでは
(float-time '(1 . 10)) は ‘0.1’ と表示されますが、実際には 1/10 をわずかに上回ります。
time-to-seconds はこの関数のエイリアスです。
現在のCPU時刻とその分解能を返します。戻り値はペア(CPU-TICKS . TICKS-PER-SEC)です。CPU-TICKSカウンタはラップアラウンドする可能性があるため、間隔が空きすぎると値を意味のある形で比較することはできません。