システム時刻またはシステム時間()とは、計算機科学およびプログラミングにおいて経過時間を表現する概念である。この意味において「時刻」とはカレンダー上の経過日数も含む。
概要 システム時刻は、「システム・クロック」によって生成される一定の「テンポ」(ティック:tick)をシステム起動時(オペレーティングシステムのブートアップ時)に読み取ったリアルタイムクロック(ハードウェアクロック)に積算することで、任意の開始時刻()からの経過時間を求めたものである。このティックは、PCではチップ上の(: PIT)から割り込みベクタ"IRQ0"を利用し定期的に発生させることが可能であり、このインターバルをシステム時刻に周期的に加算する。ではPITより高機能なHPETが搭載されていることが多い。Linuxカーネルではこのインターバル回数を"Hz"というマクロでカーネルビルド時に指定することができる。Unix系、ならびにPOSIX互換なオペレーティングシステムでは例えば、1970年1月1日0時0分0秒(UTC)すなわちUNIXエポックから閏秒を考慮しない経過時間(UNIX時間)が、Microsoft Windows NTでは1601年1月1日0時0分(UTC)からの100ナノ秒ティック単位での経過時間が主に用いられる。
システム時刻は人間にとって慣れ親しんだカレンダー時刻に容易に相互変換できる。例えば、UNIXのtime_tはこのような変換をサポートするデータ型の一つであり、UNIX時間=1,000,000,000秒を、カレンダー時刻2001-09-09 01:46:40 UTC(ただし閏秒を考慮しない)に変換して表示できる。プログラミングで用いられる時間に関するライブラリ関数やサブルーチンは、一般的に異なる時刻表現の間の相互変換だけでなく、等時帯(地球上の時差)、夏時間、閏秒またユーザーのロケール設定に合わせて調節する機能もあり、時刻を適切に扱うことができる。
その他の時刻測定法 システム時刻とともによく用いられる、コンピュータシステムに関する時間表現として、「プロセス時間」()がある。これは「実CPU時間」()とも呼ばれ、プロセス実行に要したCPU利用時間の総計であり、プログラム中でループ処理をしているときに費やされた「User CPU時間」と、execやfork等のカーネルのシステムコールを行うのに要した「System CPU時間」の合計のことである。よってプロセス時間は、CPUの命令サイクルの総数またはクロックサイクルの総数であり、一般的にはとの直接的な相関関係は存在しない。
ファイルシステムも、個々のファイルの作成・最終変更・最終アクセスの時刻を、このシステム時刻を用いてタイムスタンプという形でファイル毎に記録している。例えばUNIXではシステムコールを利用し、ctime, mtime, atimeという形で(: FCB)、すなわち各ファイル並びにディレクトリのinodeに記録する。
歴史 初期のPCではシステム時刻はコンピュータの電源を切ったと同時に消滅するため、起動ごとに時刻を設定する必要があった。CP/Mや初期のApple II、Commodore PETといったコンピュータがこれらに当たる。1981年に発売されたIBM PCが初めて、電源を切ってもバッテリーで動作し続けるリアルタイムクロックをマザーボードに搭載して、システム時刻を安定して利用できる仕組みを整えた。また、インターネットが一般的となる以前のコンピュータでは、システム時刻が「ローカルタイム」(そのコンピュータのタイムゾーン)を暗黙的に指していることもあった。
現在では、いわゆるコンピュータだけではなく、以下のような家庭用・個人用の電化製品もシステム時刻を実装・利用している。内蔵時計を駆動できるバッテリーを内蔵しているものもあるが、待機電力で駆動しているものも多く、電源ケーブルを取り外して電源を遮断すると時刻がリセットされる。 録画機能や目覚まし機能を内蔵したテレビ受像機 VTR(VCR) DVDレコーダーをはじめとする ケーブルテレビ受像機 PDA ポケベル カーナビゲーションシステム 携帯電話 Fax機器 留守番電話 デジタルカメラ カムコーダ エアコン 電子レンジ
システム時刻を得る方法
次に示すのは各種オペレーティングシステム (OS) とプログラム言語そしてアプリケーションでシステム時刻を得る手法である。
注1:開始時刻・限界時刻の欄に「 * 」を記載しているものは、アーキテクチャの状況(例:32ビット/64ビットなど)や処理系(コンパイラ)の実装などにより結果が異なることを示す。 注2:全ての日時はグレゴリオ暦または先発グレゴリオ暦である。
OSのシステムコールまたはBIOSの割り込みルーチン OS システムコール/関数 分解能 起点となる開始時刻/終了時刻BIOS (IBM PC) ラルフ・ブラウン(Ralf Brown)によるBIOS, DOSの参考資料、(2000年)では"Int 0x1A, AH=0x00"となっている。オンライン閲覧可能なもの。 54.931 ms 18.204 Hz 稼働日の午前0時 Ralf Brown, "Int 0x1A, AH=0x02" in , 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/02.html 1 s 1980-01-01 DOS(マイクロソフト) Ralf Brown, "Int 0x21, AH=0x2c" in , 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2C.html 10 ms 1980-01-01 to 2099-12-31 Mac OS(Apple) "Time Utilities Reference" in Mac OS X Developer Library (Apple, 2007). 1 ms 未満"CFRunLoopTimer Reference" in Mac OS X Developer Library (Apple, 2007). 2001-01-01 ±10,000年 OpenVMS (HP) 100 ns 1858-11-17 to AD 31,086 z/OS (IBM) z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 7-187. 2−12 µs 244.14 psz/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 4-45, 4-46. 1900-01-01 から 2042-09-17 UTC Unix系、POSIX 1 s(*) 1970-01-01 to 2038-01-19 1970-01-01 から AD 292,277,026,596 1 µs Windows(マイクロソフト) 1 ms 1601-01-01 から AD 30,828 100 ns
プログラミング言語のAPIとアプリケーション 言語/アプリ関数/プロパティ分解能起点となる開始時刻/終了時刻 Ada 100 µs to 20 ms (*) 1901-01-01 to 2099-12-31 (*) AWK 1 s (*) BASIC, True BASIC , , 1 s (*) , 0.1 s (*) C 1 s (*) (*) C++ (*) (*) C# (Microsoft) "DateTime.Now Property" in MSDN (Microsoft, 2010). 最終更新: 2010年7月。 "DateTime.UtcNow Property" in MSDN (Microsoft, 2011). 100 ns "DateTime.Ticks Property" in MSDN (Microsoft, 2010). 最終更新: 2010年5月。 0001-01-01 to 9999-12-31 CICS (IBM) 1 ms 1900-01-01 COBOL 1 s 1601-01-01 Common Lisp 1 s 1900-01-01 Delphi (Borland) 1 ms (浮動小数点数) 1900-01-01 Excel (Microsoft) ? 1900-01-00 FORTRAN (*) 1970-01-01 1 µs Haskell 1 µs(*) 1970-01-01(*) Java (Sun) 1 ms 1970-01-01 1 ns 任意 JavaScript 1 ms 1970-01-01 MUMPS (短縮形 ) 1 s 1840-12-31 LabVIEWティックカウント(ms)1 ms1904-01-01 00:00:00.000日付/時間を秒で取得1 ms Objective-C 1 ms 未満"Foundation Data Types Reference" in Mac OS X Developer Library (Apple, 2011). section NSTimeInterval. 最終更新: 2011年7月6日。 2001-01-01 ±10,000年 OCaml 1 s 1970-01-01 1 µs Extended Pascal 1 s (*) Turbo Pascal 10 ms (*) Perl 1 s 1970-01-01 1 µs PHP 1 s 1970-01-01 1 µs Python 1 µs (*) 1970-01-01 RPG , , 1 s 0001-01-01 から 9999-12-31 , 1 µs Ruby 1 µs (*) 1970-01-01 から 2038-01-19 Smalltalk (VisualWorks) 1 s (ANSI) 1 µs (VisualWorks) 1 s (Squeak) 1901-01-01 (*) (Squeak) (Chronos) SQL 3 ms 1753-01-01 to 9999-12-31 (*) 60 s 1900-01-01 to 2079-06-06 Standard ML 1 µs(*) 1970-01-01(*) Tcl 1 s 1970-01-01 1 ms 1 µs 1 µs (*) (*) Windows PowerShell "Get-Date" in Microsoft TechNet. Get-DateはPowerShellの「コマンドレット」("Commandlet", "cmdlet")である。コマンドレットとはUnix系シェルの内蔵コマンド(ビルトイン・コマンド)同様、追加のプログラムなしで利用できるコマンドである。 100 ns 0001-01-01 to 9999-12-31 Visual Basic .NET (Microsoft) 100 ns 0001-01-01 to 9999-12-31
脚注
注釈
出典
関連項目 暦 (時間複雑性、Time complexity。記事"多項式時間"も参照。)
GPS時刻 ジフィー(瞬間の意味だが、宗教・哲学的用語のそれではなく、工学、物理学的用語。) クロック プロセス UNIX時間 UNIXのdateコマンド UNIXのtimeコマンド
Network Time Protocol
time.h time_t
- 各オペレーティングシステムでの日時表示コマンド Time Protocol タイムスタンプ 時共有方式、ならびにタイムシェアリングシステム 時刻系 タイマー 年問題 2000年問題 2038年問題
外部リンク
Critical and Significant Dates, J. R. Stockton (2011-03-21編集) The BOOST Date/Time Library, Boost C++ライブラリ The Chronos Date/Time Library, Smalltalk用ライブラリ The Joda Date/Time Library, Java用ライブラリ Veyder-time, Java用ライブラリ The Perl DateTime Project, Perl用モジュール class Time, library date, Ruby用ライブラリ