「システム時刻」の版間の差分
m Bot作業依頼: Apple関連記事の改名に伴うリンク修正依頼 (Apple|Apple) - log |
|||
85行目: | 85行目: | ||
| 1980-01-01 to 2099-12-31 |
| 1980-01-01 to 2099-12-31 |
||
|- |
|- |
||
| [[Mac OS]]([[ |
| [[Mac OS]]([[Apple]]) |
||
| <tt>CFAbsoluteTimeGetCurrent()</tt><ref>[http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFTimeUtils/Reference/reference.html "Time Utilities Reference"] in ''Mac OS X Developer Library'' (Apple, 2007).</ref> |
| <tt>CFAbsoluteTimeGetCurrent()</tt><ref>[http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFTimeUtils/Reference/reference.html "Time Utilities Reference"] in ''Mac OS X Developer Library'' (Apple, 2007).</ref> |
||
| < 1 ms <ref name ="Apple_CFRunLoopTimerCreate">[http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFRunLoopTimerRef/Reference/reference.html "CFRunLoopTimer Reference"] in ''Mac OS X Developer Library'' (Apple, 2007).</ref><ref group="note" name="Apple_CF_NSTimeInterval">Appleの開発者用ドキュメントではCFAbsoluteTime/CFTimeIntervalの精度と範囲が不明瞭であるがCFRunLoopTimerCreateは「多く見積もってsub-millisecond程度」の精度を持つとの記述がある。しかしながら、同様の型[http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html NSTimeInterval]は相互に変換でき、精度と範囲が記録されている。</ref> |
| < 1 ms <ref name ="Apple_CFRunLoopTimerCreate">[http://developer.apple.com/library/mac/#documentation/CoreFoundation/Reference/CFRunLoopTimerRef/Reference/reference.html "CFRunLoopTimer Reference"] in ''Mac OS X Developer Library'' (Apple, 2007).</ref><ref group="note" name="Apple_CF_NSTimeInterval">Appleの開発者用ドキュメントではCFAbsoluteTime/CFTimeIntervalの精度と範囲が不明瞭であるがCFRunLoopTimerCreateは「多く見積もってsub-millisecond程度」の精度を持つとの記述がある。しかしながら、同様の型[http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html NSTimeInterval]は相互に変換でき、精度と範囲が記録されている。</ref> |
2021年5月20日 (木) 12:08時点における版
システム時刻またはシステム時間(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ナノ秒ティック単位での経過時間が主に用いられる。
システム時刻は人間にとって慣れ親しんだカレンダー時刻に容易に相互変換出来る。例えば、UNIXのtimeデータ型はこのような変換の一つであり、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が初めて、電源を切ってもバッテリーで動作し続けるリアルタイムクロックをマザーボードに搭載して、システム時刻を安定して利用できる仕組みを整えた。また、インターネットが一般的となる以前のコンピュータでは、システム時刻が「ローカルタイム」(そのコンピュータのタイムゾーン)を暗黙的に指していることもあった。
現在では、いわゆるコンピュータだけではなく、以下のような家庭用・個人用製品もシステム時刻を利用している。
- 薄型テレビ
- VTR(VCR)
- DVDレコーダーをはじめとするデジタルビデオレコーダ
- ケーブルテレビ受像機
- PDA
- ポケベル
- カーナビゲーションシステム
- 携帯電話
- Fax機器
- 留守番電話
- デジタルカメラ
- カムコーダ
- エアコン
- 電子レンジ
システム時刻を得る方法
次に示すのは各種オペレーティングシステムとプログラム言語そしてアプリケーションでシステム時刻を得る手法である。
* 注意:開始時刻・限界時刻の欄に「 * 」を記載しているものは、その適用するアーキテクチャーの状況(例: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(マイクロソフト) | 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(マイクロソフト) | GetSystemTime() | 1 ms | 1601-01-01 から AD 30,828 |
GetSystemTimeAsFileTime() | 100 ns | ||
GetSystemTimePreciseAsFileTime() |
プログラミング言語の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::chrono::system_clock::now() | (*)[note 6] | (*)[note 6] |
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 |
LabVIEW | ティックカウント(ms) | 1 ms | 1904-01-01 00:00:00.000 |
日付/時間を秒で取得 | 1 ms | ||
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 7] |
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 |
脚注
注釈
- ^ これをUNIXエポックタイムと呼ぶ。
- ^ a b Appleの開発者用ドキュメントではCFAbsoluteTime/CFTimeIntervalの精度と範囲が不明瞭であるがCFRunLoopTimerCreateは「多く見積もってsub-millisecond程度」の精度を持つとの記述がある。しかしながら、同様の型NSTimeIntervalは相互に変換でき、精度と範囲が記録されている。
- ^ いわゆる「修正ユリウス通日」("Modified Julian Day")の起点日
- ^ IBMは将来のシステムで日付の限界を2042年以降に拡張する予定である。z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 1-15, 4-45 to 4-47.
- ^ a b 標準Cライブラリはシステム時刻の値向けに特定の精度、起点、範囲またはデータ型を全く指定していない。ただし、POSIXにおいては、UNIX時間であることが追加で規定されている。
- ^ a b 標準C++ライブラリは特定の精度、起点、範囲またはデータ型を全く指定していない。
- ^ ただし、上限については、Ruby 1.9.2(Ruby 1.9.2 Release Notes)以前の情報。
出典
- ^ 大竹龍史 (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.
- ^ 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系シェルの内蔵コマンド(ビルトイン・コマンド)同様、追加のプログラムなしで利用できるコマンドである。
関連項目
- 暦
- 時間計算量(時間複雑性、Time complexity。記事"多項式時間"も参照。)
- エポック
- GPS時刻
- ジフィー(瞬間の意味だが、宗教・哲学的用語のそれではなく、工学、物理学的用語。)
- クロック
- プロセス
- UNIX時間
- UNIXのdateコマンド
- UNIXのtimeコマンド
- 壁時計時刻
- Network Time Protocol
- rdate
- ntpd
- ntpdate
- time.h
- time_t
- stat
- timeとdate - 各オペレーティングシステムでの日時表示コマンド
- Time Protocol
- タイムスタンプ
- 時共有方式、ならびにタイムシェアリングシステム
- 時刻系
- タイマー
- 年問題
外部リンク
- Critical and Significant Dates[リンク切れ], J. R. Stockton (2011-03-21編集)
- The BOOST Date/Time Library, BoostC++ライブラリ
- The Chronos Date/Time Library, Smalltalk用ライブラリ
- The Joda Date/Time Library, Java用ライブラリ
- Veyder-time, Java用ライブラリ
- The Perl DateTime Project , Perl用モジュール
- The Ruby Date/Time Library [リンク切れ], Ruby用ライブラリ