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 )すなわち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(ただし閏秒 を考慮しない)に変換して表示できる。プログラミングで用いられる時間に関するライブラリ 関数やサブルーチン は、一般的に異なる時刻表現の間の相互変換だけでなく、等時帯 (地球上の時差)、夏時間 、閏秒またユーザーのロケール 設定に合わせて調節する機能もあり、時刻を適切に扱うことができる。
その他の時刻測定法
システム時刻とともによく用いられる、コンピュータシステムに関する時間表現として、「プロセス時間」(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 II 、Commodore PET といったコンピュータがこれらに当たる。1981年 に発売されたIBM PC が初めて、電源を切ってもバッテリー で動作し続けるリアルタイムクロック をマザーボード に搭載して、システム時刻を安定して利用できる仕組みを整えた。また、インターネット が一般的となる以前のコンピュータでは、システム時刻が「ローカルタイム」(そのコンピュータのタイムゾーン )を暗黙的に指していることもあった。
現在では、いわゆるコンピュータだけではなく、以下のような家庭用・個人用の電化製品もシステム時刻を実装・利用している。内蔵時計を駆動できるバッテリーを内蔵しているものもあるが、待機電力で駆動しているものも多く、電源ケーブルを取り外して電源を遮断すると時刻がリセットされる。
システム時刻を得る方法
2025年1月27日 12:57:17 UTC
ウィキペディアにおいてこのページがキャッシュされた最後のシステム時刻
次に示すのは各種オペレーティングシステムとプログラム言語そしてアプリケーションでシステム時刻を得る手法である。
注1:開始時刻・限界時刻の欄に「 * 」を記載しているものは、アーキテクチャーの状況(例:32ビット/64ビットなど)や処理系(コンパイラ )の実装などにより結果が異なることを示す。
注2:全ての日時はグレゴリオ暦 または先発グレゴリオ暦 である。
OSのシステムコールまたはBIOSの割り込みルーチン
プログラミング言語のAPIとアプリケーション
言語 /アプリ
関数/プロパティ
分解能 [ 注釈 1]
起点となる開始時刻/終了時刻
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 (*)[ 注釈 5]
(*)[ 注釈 5]
C++
std::chrono::system_clock::now() [ 注釈 6]
(*)[ 注釈 7]
(*)[ 注釈 7]
C# (Microsoft )
System.DateTime.Now [ 11] System.DateTime.UtcNow [ 12]
100 ns [ 13]
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 [ 14]
FORTRAN
DATE_AND_TIME SYSTEM_CLOCK
(*)[ 15] [ 16]
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() [ 17]
1 ns
任意[ 17]
JavaScript
Date()
1 ms
1970-01-01
MUMPS
$H (短縮形 $HOROLOG (英語版 ) )
1 s
1840-12-31
LabVIEW
ティックカウント(ms)
1 ms
1904-01-01 00:00:00.000
日付/時間を秒で取得
1 ms
Objective-C
[NSDate timeIntervalSinceReferenceDate]
1 ms 未満[ 18]
2001-01-01 ±10,000年[ 18]
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 [ 19]
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() [ 20]
1 µs (*)
1970-01-01 から 2038-01-19[ 注釈 8]
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 [ 21]
100 ns [ 13]
0001-01-01 to 9999-12-31
[DateTime]::Now [ 11] [DateTime]::UtcNow [ 12]
Visual Basic .NET (Microsoft )
System.DateTime.Now [ 11] System.DateTime.UtcNow [ 12]
100 ns [ 13]
0001-01-01 to 9999-12-31
脚注
注釈
出典
^
大竹龍史 (2008年12月26日). “暗記に頼らずちゃんと理解 実践でも役立つLPICドリル - 第8回 Linux時刻管理の仕組みと設定 ”. アットマーク・アイティ . jibun.atmarkit.co.jp. 2011年8月12日 閲覧。
^
“Real Time Clock (RTC) Drivers for Linux ”. git.kernel.org. 2011年8月12日 閲覧。
^ ラルフ・ブラウン(Ralf Brown)によるBIOS, DOSの参考資料、ラルフ・ブラウンの割り込みリスト (英語版 ) (2000年)では"Int 0x1A, AH=0x00"となっている。オンライン閲覧可能なもの 。
^ Ralf Brown, "Int 0x1A, AH=0x02" in Ralf Brown's Interrupt List (英語版 ) , 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/02.html
^ Ralf Brown, "Int 0x21, AH=0x2c" in Ralf Brown's Interrupt List (英語版 ) , 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2C.html
^ "Time Utilities Reference" in Mac OS X Developer Library (Apple, 2007).
^ a b "CFRunLoopTimer Reference" in Mac OS X Developer Library (Apple, 2007).
^ z/Architecture Principles of Operation , (Poughkeepsie, New York:International Business Machines , 2007) 7-187.
^ z/Architecture Principles of Operation , (Poughkeepsie, New York:International Business Machines , 2007) 4-45, 4-46.
^ z/Architecture Principles of Operation , (Poughkeepsie, New York:International Business Machines , 2007) 1-15, 4-45 to 4-47.
^ a b c "DateTime.Now Property" in MSDN (Microsoft, 2010). 最終更新: 2010年7月。
^ a b c "DateTime.UtcNow Property" in MSDN (Microsoft, 2011).
^ a b c "DateTime.Ticks Property" in MSDN (Microsoft, 2010). 最終更新: 2010年5月。
^ “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.”
^
“FORTRAN SYSTEM_CLOCK ”. Intel Corp. . 2011年5月10日 閲覧。
^
“FORTRAN SYSTEM_CLOCK — Time function ”. GNUプロジェクト . 2011年5月12日 閲覧。
^ a b
“System.nanoTime()メソッド ”. Java Platform, Standard Edition 6: API Specification . Oracle (2011年). 2011年11月5日 閲覧。
^ a b "Foundation Data Types Reference" in Mac OS X Developer Library (Apple, 2011). section NSTimeInterval. 最終更新: 2011年7月6日。
^
Douglas Wegscheild, R. Schertler and Jarkko Hietaniemi (2011年6月9日). “Jarkko Hietaniemi / Time-HiRes - search.cpan.org ”. search.cpan.org. 2011年11月5日 閲覧。
^
Scottsdale, AZ: James Britt and Neurogami. “Time class ”. Ruby-Doc.org: Help and documentation for the Ruby programming language. 2011年11月5日 閲覧。
^ "Get-Date" in Microsoft TechNet. Get-DateはPowerShellの「コマンドレット」("Commandlet", "cmdlet")である。コマンドレットとはUnix系シェルの内蔵コマンド(ビルトイン・コマンド)同様、追加のプログラムなしで利用できるコマンドである。
関連項目
外部リンク
主要概念 単位と規格
時計 編年 ・ 歴史宗教 ・ 神話 哲学 人間の経験と 時間の利用 分野別の時間
関連項目