
コンピューティングにおいて、システム時間はコンピュータ システムの時点の概念を表します。
システム時間は、システム クロックによって測定されます。システム クロックは通常、エポックと呼ばれる任意の開始日から経過したティックの数を単純にカウントする形で実装されています。たとえば、UnixおよびPOSIX準拠のシステムでは、うるう秒を除いて、1970 年 1 月 1 日 00:00:00 UTのUnix エポックの開始から経過した秒数としてシステム時間 (「Unix 時間」) をエンコードします。Windows 9xやWindows NTなど、32 ビット版と 64 ビット版のWindows APIを実装しているシステムでは、年/月/日/時/分/秒/ミリ秒の値として表されるSYSTEMTIMEと、先発グレゴリオ暦で計算された 1601 年 1 月 1 日 00:00:00 UT からの 100 ナノ秒ティックの数として表されるFILETIMEの両方でシステム時間を提供します。
システム時刻は、人間にとってより理解しやすい形式であるカレンダー時刻に変換できます。例えば、Unixシステム時刻 (エポック開始から1 000 000 000秒)は、カレンダー時刻(2001年9月9日 01:46:40 UT)に変換されます。このような変換を処理するライブラリサブルーチンは、タイムゾーン、夏時間(DST)、うるう秒、およびユーザーのロケール設定の調整も処理できます。また、カレンダー時刻をシステム時刻に変換するライブラリルーチンも一般的に提供されています。
現在システム時刻を32ビット整数値として保存している多くの実装は、差し迫った2038年問題などの問題に悩まされることになります。これらの時刻値は、システム時刻のエポックの終了後にオーバーフロー(「ビット不足」)し、ソフトウェアおよびハードウェアのエラーにつながります。これらのシステムには、以前の2000年問題の解決に必要だった取り組みと同様の、何らかの形の修復が必要になります。これは、32ビット値として保存されたシステムタイムスタンプを含む 既存のデータファイル形式にとっても、潜在的にはるかに大きな問題となる可能性があります。
システム時間と密接に関連しているのがプロセス時間です。これは、実行中のプロセスによって消費されるCPU時間の合計です。これはユーザーCPU時間とシステムCPU時間に分けられ、それぞれユーザーコードとシステムカーネルコードの実行に費やされた時間を表します。プロセス時間はCPU命令またはクロックサイクルに要した時間の合計であり、通常、ウォールタイムとは直接的な相関関係はありません。
ファイル システムは、各ファイルおよびディレクトリのファイル制御ブロック(またはinode )にタイムスタンプを保存することによって、ファイルが作成、変更、またはアクセスされた時刻を追跡します。
第一世代のパーソナルコンピュータのほとんどは、日付と時刻を記録していませんでした。これには、CP/Mオペレーティングシステムを搭載したシステム、 Apple II、BBC Micro、Commodore PETなどの初期モデルが含まれます。IBM PCおよびXTでは、オンボードバッテリバックアップ付きのリアルタイムクロックチップを搭載したアドオン周辺ボードが利用可能でしたが、マザーボードに日付/時刻ハードウェアを内蔵した最初の普及型PCはIBM ATでした。コンピュータネットワークが広く普及する以前は、システム時刻を記録していたほとんどのパーソナルコンピュータシステムは現地時間のみに基づいており、異なるタイムゾーンを考慮していませんでした。
現在の技術では、ほとんどの最新コンピューターが現地の常用時を追跡しており、VCR、DVR、ケーブルテレビ受信機、PDA、ポケベル、携帯電話、ファックス機、留守番電話、カメラ、カムコーダー、セントラルエアコン、電子レンジなど、他の多くの家庭用および個人用デバイスも同様です。
組み込みシステム(Raspberry Pi、Arduino、その他の類似システムなど)内で動作するマイクロコントローラは、必ずしも時刻を追跡するための内部ハードウェアを備えているわけではありません。このようなコントローラシステムの多くは、外部時刻を意識することなく動作します。外部時刻情報を必要とするシステムでは、通常、再起動時にタイムサーバーや外部クロックなどの外部ソースから現在時刻を取得するか、ユーザーに現在時刻を手動で入力するよう 促すことで、ベースタイムを初期化します。
システムクロックは通常、プログラム可能なインターバルタイマーとして実装され、CPUに定期的に割り込みをかけます。CPUはタイマー割り込みサービスルーチンの実行を開始します。このルーチンは通常、システムクロック(単純なカウンタ)に1ティックを追加し、その他の定期的なハウスキーピングタスク(プリエンプションなど)を処理してから、割り込み前にCPUが実行していたタスクに戻ります。
以下の表は、様々なオペレーティングシステム、プログラミング言語、アプリケーションにおける現在のシステム時刻の取得方法を示しています。(*) でマークされた値はシステム依存であり、実装によって異なる場合があります。日付はすべてグレゴリオ暦または先発グレゴリオ暦で表されます。
実装における時間測定の分解能は、必ずしも実際の測定精度と同じとは限りません。例えば、あるシステムは現在の時刻をマイクロ秒単位で返しますが、実際には100Hz(10ミリ秒)の周波数で個々のクロックティックを識別できる場合があります。
| オペレーティング·システム | コマンドまたは機能 | 解決 | 時代または範囲 |
|---|---|---|---|
| アンドロイド | java.lang.System.currentTimeMillis() | 1ミリ秒 | 1970年1月1日 |
| BIOS ( IBM PC ) | INT 1Ah, AH=00h[ 1 ] | 54.9254ミリ秒18.2065Hz | 当日の深夜 |
INT 1Ah, AH=02h[ 2 ] | 1秒 | 当日の深夜 | |
INT 1Ah, AH=04h[ 3 ] | 1日 | 1980年1月1日から1999年12月31日まで、または2079年12月31日まで(システムにより異なる) | |
| CP/Mプラス | システム制御ブロック: [ 4 ]scb$base+58h、1977年12月31日からの日数 scb$base+5Ah、時(BCD) scb$base+5Bh、分(BCD) scb$base+5Ch、秒(BCD) | 1秒 | 1977年12月31日から2157年6月5日まで |
BDOS関数69h> ( T_GET): [ 5 ]word、1978年1月1日からの日数 byte、時(BCD) byte、分(BCD) byte、秒(BCD) | |||
| DOS (マイクロソフト) | C:\>DATEC:\>TIME | 10ミリ秒 | 1980年1月1日から2099年12月31日まで |
INT 21h, AH=2Ch SYSTEM TIME[ 6 ] INT 21h, AH=2Ah SYSTEM DATE[ 7 ] | |||
| macOS、iOS、iPadOS、tvOS、watchOS、visionOS ( Apple ) | CFAbsoluteTimeGetCurrent()[ 8 ] | < 1 ms [ 9 ] [注 1 ] | 2001年1月1日 ±10,000年[ 9 ] [注 1 ] |
| オープンVMS | SYS$GETTIM() | 100ナノ秒[ 10 ] | 1858年11月17日から7月31日まで 31,086 [ 11 ] |
| () | 1μs [ 12 ] | 1970年1月1日から2106年2月7日まで[ 13 ] | |
| () | 1ナノ秒[ 12 ] | ||
| z/OS | STCK[ 14 ] : 7–187 | 2 −12 μs 244.14 ps [ 14 ] : 4–45, 4–46 | 1900年1月1日から2042年9月17日(UT)[ 15 ] |
STCKE | 1900年1月1日から西暦36,765年まで[ 16 ] | ||
| Unix、POSIX ( Cの日付と時刻関数も参照) | $datetime() | 1秒 | (*) 32ビットtime_t: 1970年1月1日から2038年1月19日まで64ビットtime_t: 1970年1月1日から西暦292,277,026,596年12月4日まで |
| () | 1μs | ||
| () | 1ナノ秒 | ||
| OS/2 | DosGetDateTime() | 10ミリ秒 | 1980年1月1日から2079年12月31日まで[ 17 ] |
| ウィンドウズ | GetSystemTime() | 1ミリ秒 | 1601年1月1日から30828年9月14日、02:48:05.4775807 |
GetSystemTimeAsFileTime() | 100ナノ秒 | ||
GetSystemTimePreciseAsFileTime() |
| 言語/アプリケーション | 関数または変数 | 解決 | 時代または範囲 |
|---|---|---|---|
| エイダ | Ada.Calendar.Clock | 100 μs~20 ms(*) | 1901年1月1日から2099年12月31日まで(*) |
| AWK | systime() | 1秒 | (*) |
| BASIC、真のBASIC | DATE、、DATE$TIMETIME$ | 1秒 | (*) |
| ビジネスベーシック | DAY、TIM | 0.1秒 | (*) |
| C(Cの日付と時刻関数を参照) | time() | 1秒(*)[注2 ] | (*)[注2 ] |
| C++ | std::time()std::chrono::system_clock::now() | 1秒(*)[注2 ] 1ナノ秒(C++11、OS依存) | (*)[注2 ] |
| C# | System.DateTime.Now[ 18 ] System.DateTime.UtcNow[ 19 ] | 100ナノ秒[ 20 ] | 0001年1月1日から9999年12月31日まで |
| CICS | ASKTIME | 1ミリ秒 | 1900年1月1日 |
| コボル | FUNCTION CURRENT-DATE | 1秒 | 1601年1月1日 |
| コモンリスプ | (get-universal-time) | 1秒 | 1900年1月1日 |
| Delphi (ボーランド) | datetime | 1ミリ秒(浮動小数点) | 1900年1月1日 |
| Delphi(エンバカデロ・テクノロジーズ)[ 21 ] | System.SysUtils.Time[ 22 ] | 1ミリ秒 | 0/0/0000 0:0:0:000 から12/31/9999 23:59:59:999 [sic] |
System.SysUtils.GetTime[ 23 ](別名System.SysUtils.Time) | |||
System.SysUtils.Date[ 24 ] | 0/0/0000 0:0:0:000 から12/31/9999 0:0:0:000 [sic] | ||
System.DateUtils.Today[ 25 ] | |||
System.DateUtils.Tomorrow[ 26 ] | |||
System.DateUtils.Yesterday[ 27 ] | |||
System.SysUtils.Now[ 28 ] | 1秒 | 0/0/0000 0:0:0:000 から12/31/9999 23:59:59:000 [sic] | |
System.SysUtils.DayOfWeek[ 29 ] | 1日 | 1から7 | |
System.SysUtils.CurrentYear[ 30 ] | 1年 | (*) | |
| Emacs Lisp | (current-time) | 1μs(*) | 1970年1月1日 |
| アーラン | erlang:system_time(), [ 31 ]os:system_time() | OS依存、例:Linuxでは1ns [ 31 ] | 1970年1月1日[ 31 ] |
| エクセル | date() | ? | 1900年1月0日[ 32 ] |
| フォートラン | DATE_AND_TIMESYSTEM_CLOCK | (*)[ 33 ] | 1970年1月1日 |
CPU_TIME | 1μs | ||
| 行く | time.Now() | 1ナノ秒 | 0001年1月1日 |
| ハスケル | Time.getClockTime | 1ps(*) | 1970年1月1日(*) |
Data.Time.getCurrentTime | 1ps(*) | 1858年11月17日(*) | |
| ジャワ | java.util.Date()System.currentTimeMillis() | 1ミリ秒 | 1970年1月1日 |
System.nanoTime()[ 35 ] | 1ナノ秒 | 恣意的[ 35 ] | |
Clock.systemUTC()[ 36 ] | 1ナノ秒 | 恣意的[ 37 ] | |
| JavaScript、TypeScript | (new Date()).getTime()Date.now() | 1ミリ秒 | 1970年1月1日 |
| ジュリア | Dates.now() | 1ミリ秒 | 0000年1月1日[ 38 ] |
| Matlab | now | 1秒 | 0000年1月0日[ 39 ] |
| おたふく風邪 | $H(の略$HOROLOG) | 1秒 | 1840年12月31日 |
| ラボビュー | Tick Count | 1ミリ秒 | 00:00:00.000 1904年1月1日 |
Get Date/Time in Seconds | 1ミリ秒 | 00:00:00.000 1904年1月1日 | |
| Objective-C | [NSDate timeIntervalSinceReferenceDate] | 1ミリ秒未満[ 40 ] | 2001年1月1日 ±10,000年[ 40 ] |
| OCaml | Unix.time() | 1秒 | 1970年1月1日 |
Unix.gettimeofday() | 1μs | ||
| 拡張パスカル | GetTimeStamp() | 1秒 | (*) |
| ターボパスカル | GetTime()GetDate() | 10ミリ秒 | (*) |
| パール | time() | 1秒 | 1970年1月1日 |
Time::HiRes::time[ 41 ] | 1μs | ||
| PHP | time()mktime() | 1秒 | 1970年1月1日 |
microtime() | 1μs | ||
| ピュアベーシック | Date() | 1秒 | 1970年1月1日から2038年1月19日まで |
| パイソン | datetime.now().timestamp() | 1μs(*) | 1970年1月1日 |
| ロールプレイング | CURRENT(DATE)、、%DATECURRENT(TIME)%TIME | 1秒 | 0001年1月1日から9999年12月31日まで |
CURRENT(TIMESTAMP)、%TIMESTAMP | 1μs | ||
| ルビー | Time.now()[ 42 ] | 1μs(*) | 1970年1月1日(Ruby 1.9.2より前のバージョンでは2038年1月19日まで[ 43 ]) |
| スキーム | (get-universal-time)[ 44 ] | 1秒 | 1900年1月1日 |
| 雑談 | Time microsecondClock(ビジュアルワークス) | 1秒(ANSI) 1μ秒(VisualWorks) 1秒(Squeak) | 1901年1月1日(*) |
Time totalSeconds(キーキー) | |||
SystemClock ticksNowSinceSystemClockEpoch(クロノス) | |||
| SQL | CURDATE()またはまたはCURRENT DATECURTIME()またはCURRENT TIMEGETDATE()またはGETUTCDATE()NOW()またはCURRENT TIMESTAMPSYSDATE() | 3ミリ秒 | 1753年1月1日から9999年12月31日まで(*) |
| 1分 | 1900年1月1日から2079年6月6日まで | ||
| 標準ML | Time.now() | 1μs(*) | 1970年1月1日(*) |
| Tcl | [clock seconds] | 1秒 | 1970年1月1日 |
[clock milliseconds] | 1ミリ秒 | ||
[clock microseconds] | 1μs | ||
[clock clicks] | 1μs(*) | (*) | |
| Windows PowerShell | Get-Date[ 45 ] [ 46 ] | 100ナノ秒[ 20 ] | 0001年1月1日から9999年12月31日まで |
[DateTime]::Now[ 18 ] [DateTime]::UtcNow[ 19 ] | |||
| ビジュアルベーシック.NET | System.DateTime.Now[ 18 ] System.DateTime.UtcNow[ 19 ] | 100ナノ秒[ 20 ] | 0001年1月1日から9999年12月31日まで |
/2 Warp 4では、日付と時刻は2000年をはるかに超え、さらには2038年をはるかに超え、OS/2 Warp 4のリアルタイムクロックの限界である2079年まで対応可能です。
。Microsoft Officeスプレッドシートコンポーネントでは、値0は1899年12月30日、値1は1899年12月31日と評価されます。…Excelでは、値0は1900年1月0日、値1は1900年1月1日と評価されます。
新しい 1.9.2 は、以下の変更点を除いて 1.9.1 とほぼ互換性があります。… 時刻が再実装されました。2038 年に関するバグが修正されました。