システム時刻

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
UNIXdateコマンドの実行例

システム時刻またはシステム時間system time)とは、計算機科学およびプログラミングにおいて経過時間を表現する概念である。この意味において「時刻」とはカレンダー上の経過日数も含む。

概要[編集]

システム時刻は、「システム・クロック」によって生成される一定の「テンポ」(ティック:tick)をシステム起動時(オペレーティングシステムブートアップ時)に読み取ったリアルタイムクロック(ハードウェアクロック)に積算することで、任意の開始時刻(エポック英語版)からの経過時間を求めたものである。このティックは、PCではIntel 8253英語版チップ上のプログラマブル・インターバル・タイマー英語版(Programmable interval timer, PIT)から割り込みベクタ"IRQ0"を利用し定期的に発生させることが可能であり、このインターバルをシステム時刻に周期的に加算する[1]。近年ではPITより高機能なHPETが搭載されていることが多い。Linuxカーネルではこのインターバル回数を"Hz"というマクロカーネルビルド時に指定することができる[2]Unix系、ならびにPOSIX互換なオペレーティングシステムでは例えば、1970年1月1日0時0分0秒(UTC[note 1]から閏秒を考慮しない経過時間(UNIX時間)が、Microsoft Windows NTでは1601年1月1日0時0分(UTC)(先発グレゴリオ暦)からの100ナノ秒ティック単位での経過時間が主に用いられる。ただし後者は、現在時刻を最も近いミリ秒の値に近似している。

システム時刻は人間にとって慣れ親しんだカレンダー時刻に容易に相互変換出来る。例えば、UNIXtimeデータ型はこのような変換の一つであり、UNIX時間=1,000,000,000秒を、カレンダー時刻2001-09-09 01:46:40 UTC(ただし閏秒を考慮しない)に変換して表示出来る。プログラミングで用いられる時間に関するライブラリ関数やサブルーチンは、一般的に時刻表現相互間の変換だけでなく、等時帯(地球上の時差)、夏時間、閏秒またユーザーのロケール設定に合わせて調節する機能もあり、時刻を適切に扱うことが出来る。

その他の時刻測定法[編集]

システム時刻とともによく用いられるシステムに関する時間表現で、プロセス時間(process time または 「実CPU時間」 real CPU time)がある。これはプロセス実行に要したCPU利用時間の総計であり、プログラム中でループ処理をしているときに費やされたUser CPU時間と、exec英語版fork等のカーネルシステムコールを行うのに要したSystem CPU時間の合計のことである。よってプロセス時間は、CPUの命令サイクルの総数またはクロックサイクルの総数であり、一般的には壁時計時刻英語版との直接的な相関関係は存在しない。

ファイルシステムも、個々のファイルの作成・最終変更・最終アクセスの時刻を、このシステム時刻を用いてタイムスタンプという形でファイル毎に記録している。例えばUNIXではシステムコールstat英語版を利用し、ctime, mtime, atimeという形でファイル制御ブロック英語版(File control block, FCB)、すなわち各ファイル並びにディレクトリinodeに記録する。

歴史[編集]

初期のPCではシステム時刻はコンピュータの電源を切ったと同時に消滅するため、起動ごとに時刻を設定する必要があった。CP/Mオペレーティングシステムや初期のApple IICommodore PETといったコンピュータがこれらに当たる。1981年に発売されたIBM PCが初めて、電源を切ってもバッテリーで動作し続けるリアルタイムクロックマザーボードに搭載して、システム時刻を安定して利用できる仕組みを整えた。また、インターネットが一般的となる以前のコンピュータでは、システム時刻が「ローカルタイム」(そのコンピュータのタイムゾーン)を暗黙的に指していることもあった。

現在では、いわゆるコンピュータだけではなく、以下のような家庭用・個人用製品もシステム時刻を利用している。

システム時刻を得る方法[編集]

次に示すのは各種オペレーティングシステムとプログラム言語そしてアプリケーションでシステム時刻を得る手法である。

* 注意:開始時刻・限界時刻の欄に「 * 」を記載しているものは、その適用するアーキテクチャーの状況(例:32ビットか64ビットか等)により結果が異なることを示す。
全ての日時はグレゴリオ暦または先発グレゴリオ暦である。

OSのシステムコールまたはBIOSの割り込みルーチン[編集]

OS システムコール/関数 精度 起点となる開始時刻/終了時刻
BIOS (IBM PC) INT 1Ah,AH=00h[3] 54.931 ms
18.204 Hz
稼働日の午前0時
INT 1Ah,AH=02h[4] 1 s 1980-01-01
DOS (Microsoft) TIME
INT 21h,AH=2Ch[5]
10 ms 1980-01-01 to 2099-12-31
Mac OS (Apple) CFAbsoluteTimeGetCurrent()[6] < 1 ms [7][note 2] 2001-01-01 ±10,000年[7][note 2]
OpenVMS (HP) SYS$GETTIM() 100 ns 1858-11-17[note 3] to AD 31,086
z/OS (IBM) STCK[8] 2−12 μs
244.14 ps[9]
1900-01-01 から 2042-09-17 UT[note 4]
Unix系, POSIX date
time()
1 s (*)
1970-01-01 to 2038-01-19
1970-01-01 から AD 292,277,026,596
gettimeofday() 1 μs
Windows (Microsoft) GetSystemTime() 1 ms 1601-01-01 から AD 30,828
GetSystemTimeAsFileTime() 100 ns

プログラミング言語のAPIとアプリケーション[編集]

言語/アプリ 関数/値 精度 起点となる開始時刻/終了時刻
Ada Ada.Calendar.Clock 100 μs to
20 ms (*)
1901-01-01 to 2099-12-31 (*)
AWK systime() 1 s (*)
BASIC, True BASIC DATE, DATE$
TIME, TIME$
1 s (*)
Business Basic英語版 DAY, TIM 0.1 s (*)
C time() 1 s (*)[note 5] (*)[note 5]
C++ std::time() 1 s (*)[note 5] (*)[note 5]
C# (Microsoft) System.DateTime.Now[10]
System.DateTime.UtcNow[11]
100 ns [12] 0001-01-01 to 9999-12-31
CICS (IBM) ASKTIME 1 ms 1900-01-01
COBOL FUNCTION CURRENT-DATE 1 s 1601-01-01
Common Lisp (get-universal-time) 1 s 1900-01-01
Delphi (Borland) date
time
1 ms
(浮動小数点数)
1900-01-01
Excel (Microsoft) date()  ? 1900-01-00[13]
FORTRAN DATE_AND_TIME
SYSTEM_CLOCK
(*)[14][15] 1970-01-01
CPU_TIME 1 μs
Haskell Time.getClockTime 1 μs(*) 1970-01-01(*)
Java (Sun) java.util.Date()
System.currentTimeMillis()
1 ms 1970-01-01
System.nanoTime()[16] 1 ns 任意[16]
JavaScript Date() 1 ms 1970-01-01
MUMPS $H (短縮形 $HOROLOG英語版) 1 s 1840-12-31
Objective-C [NSDate timeIntervalSinceReferenceDate] < 1 ms[17] 2001-01-01 ±10,000年[17]
OCaml Unix.time () 1 s 1970-01-01
Unix.gettimeofday () 1 μs
Extended Pascal GetTimeStamp() 1 s (*)
Turbo Pascal GetTime()
GetDate()
10 ms (*)
Perl time() 1 s 1970-01-01
Time::HiRes::time[18] 1 μs
PHP time()
mktime()
1 s 1970-01-01
microtime() 1 μs
Python time.time() 1 μs (*) 1970-01-01
RPG CURRENT(DATE), %DATE
CURRENT(TIME), %TIME
1 s 0001-01-01 から 9999-12-31
CURRENT(TIMESTAMP), %TIMESTAMP 1 μs
Ruby Time.now()[19] 1 μs (*) 1970-01-01 から 2038-01-19[note 6]
Smalltalk Time microsecondClock
(VisualWorks)
1 s (ANSI)
1 μs (VisualWorks)
1 s (Squeak)
1901-01-01 (*)
Time totalSeconds
(Squeak)
SystemClock ticksNowSinceSystemClockEpoch
(Chronos)
SQL CURDATE()
CURTIME()
GETDATE()
NOW()
SYSDATE()
3 ms 1753-01-01 to 9999-12-31 (*)
60 s 1900-01-01 to 2079-06-06
Standard ML Time.now () 1 μs(*) 1970-01-01(*)
Tcl [clock seconds] 1 s 1970-01-01
[clock milliseconds] 1 ms
[clock microseconds] 1 μs
[clock clicks] 1 μs (*) (*)
Windows PowerShell Get-Date[20] 100 ns [12] 0001-01-01 to 9999-12-31
[DateTime]::Now[10]
[DateTime]::UtcNow[11]
Visual Basic .NET (Microsoft) System.DateTime.Now[10]
System.DateTime.UtcNow[11]
100 ns [12] 0001-01-01 to 9999-12-31

脚注[編集]

[ヘルプ]

注釈[編集]

  1. ^ これをUNIXエポックタイムと呼ぶ。
  2. ^ a b Appleの開発者用ドキュメントではCFAbsoluteTime/CFTimeIntervalの精度と範囲が不明瞭であるがCFRunLoopTimerCreateは「多く見積もってsub-millisecond程度」の精度を持つとの記述がある。しかしながら、同様の型NSTimeIntervalは相互に変換でき、精度と範囲が記録されている。
  3. ^ いわゆる「修正ユリウス通日」("Modified Julian Day")の起点日
  4. ^ IBMは将来のシステムで日付の限界を2042年以降に拡張する予定である。z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 1-15, 4-45 to 4-47.
  5. ^ a b c d 標準Cライブラリシステム時刻の値向けに特定の精度、起点、範囲またはデータ型を全く指定していない。C++ライブラリは、Cライブラリを包含しているため、システム時刻に関してはCと同一の実装を利用している。
  6. ^ ただし、上限については、Ruby 1.9.2(Ruby 1.9.2 Release Notes)以前の情報。

出典[編集]

  1. ^ 大竹龍史 (2008年12月26日). “暗記に頼らずちゃんと理解 実践でも役立つLPICドリル - 第8回 Linux時刻管理の仕組みと設定”. アットマーク・アイティ. jibun.atmarkit.co.jp. 2011年8月12日閲覧。
  2. ^ Real Time Clock (RTC) Drivers for Linux”. git.kernel.org. 2011年8月12日閲覧。
  3. ^ ラルフ・ブラウン(Ralf Brown)によるBIOS, DOSの参考資料、ラルフ・ブラウンの割り込みリスト英語版(2000年)では"Int 0x1A, AH=0x00"となっている。オンライン閲覧可能なもの
  4. ^ Ralf Brown, "Int 0x1A, AH=0x02" in Ralf Brown's Interrupt List英語版, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/02.html
  5. ^ Ralf Brown, "Int 0x21, AH=0x2c" in Ralf Brown's Interrupt List英語版, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2C.html
  6. ^ "Time Utilities Reference" in Mac OS X Developer Library (Apple, 2007).
  7. ^ a b "CFRunLoopTimer Reference" in Mac OS X Developer Library (Apple, 2007).
  8. ^ z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 7-187.
  9. ^ z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 4-45, 4-46.
  10. ^ a b c "DateTime.Now Property" in MSDN (Microsoft, 2010). 最終更新: 2010年7月。
  11. ^ a b c "DateTime.UtcNow Property" in MSDN (Microsoft, 2011).
  12. ^ a b c "DateTime.Ticks Property" in MSDN (Microsoft, 2010). 最終更新: 2010年5月。
  13. ^ XL2000: Early Dates on Office Spreadsheet Component Differ from Excel”. Microsoft (2003年). 2011年5月8日閲覧。 “In the Microsoft Office Spreadsheet Component, the value 0 evaluates to the date December 30, 1899 and the value 1 evaluates to December 31, 1899. ... In Excel, the value 0 evaluates to January 0, 1900 and the value 1 evaluates to January 1, 1900.”
  14. ^ FORTRAN SYSTEM_CLOCK”. Intel Corp.. 2011年5月10日閲覧。
  15. ^ FORTRAN SYSTEM_CLOCK — Time function”. GNU. 2011年5月12日閲覧。
  16. ^ a b System.nanoTime()メソッド”. Java Platform, Standard Edition 6: API Specification. Oracle (2011年). 2011年11月5日閲覧。
  17. ^ a b "Foundation Data Types Reference" in Mac OS X Developer Library (Apple, 2011). section NSTimeInterval. 最終更新: 2011年7月6日。
  18. ^ Douglas Wegscheild, R. Schertler and Jarkko Hietaniemi (2011年6月9日). “Jarkko Hietaniemi / Time-HiRes - search.cpan.org”. search.cpan.org. 2011年11月5日閲覧。
  19. ^ Scottsdale, AZ: James Britt and Neurogami. “Time class”. Ruby-Doc.org: Help and documentation for the Ruby programming language. 2011年11月5日閲覧。
  20. ^ "Get-Date" in Microsoft TechNet. Get-DateはPowerShellの「コマンドレット」("Commandlet", "cmdlet")である。コマンドレットとはUnix系シェルの内蔵コマンド(ビルトイン・コマンド)同様、追加のプログラムなしで利用できるコマンドである。

関連項目[編集]

外部リンク[編集]