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

## 概要

システム時刻は、「システム・クロック」によって生成される一定の「テンポ」(ティック:tick)をシステム起動時(オペレーティングシステムのブートアップ時)に読み取ったリアルタイムクロック(ハードウェアクロック)に積算することで、任意の開始時刻(エポック)からの経過時間を求めたものである。このティックは、PCではIntel 8253チップ上のプログラマブル・インターバル・タイマー(Programmable Interval Timer: 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(ただし閏秒を考慮しない)に変換して表示できる。プログラミングで用いられる時間に関するライブラリ関数やサブルーチンは、一般的に異なる時刻表現の間の相互変換だけでなく、等時帯(地球上の時差)、夏時間、閏秒またユーザーのロケール設定に合わせて調節する機能もあり、時刻を適切に扱うことができる。

## その他の時刻測定法

システム時刻とともによく用いられる、コンピュータシステムに関する時間表現として、「プロセス時間」(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機器
- 留守番電話
- デジタルカメラ
- カムコーダ
- エアコン
- 電子レンジ

## システム時刻を得る方法

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

- 注1:開始時刻・限界時刻の欄に「 \* 」を記載しているものは、アーキテクチャーの状況(例:32ビット/64ビットなど)や処理系の実装などにより結果が異なることを示す。
- 注2:全ての日時はグレゴリオ暦または先発グレゴリオ暦である。

### OSのシステムコールまたはBIOSの割り込みルーチン

| OS | システムコール/関数 | 分解能 | 起点となる開始時刻/終了時刻 |
| --- | --- | --- | --- |
| BIOS (IBM PC) | INT 1Ah,AH=00h | 54.931 ms  18.204 Hz | 稼働日の午前0時 |
| INT 1Ah,AH=02h | 1 s | 1980-01-01 |
| DOS(マイクロソフト) | TIME  INT 21h,AH=2Ch | 10 ms | 1980-01-01 to 2099-12-31 |
| Mac OS(Apple) | CFAbsoluteTimeGetCurrent() | 1 ms 未満 | 2001-01-01 ±10,000年 |
| OpenVMS (HP) | SYS$GETTIM() | 100 ns | 1858-11-17 to AD 31,086 |
| z/OS (IBM) | STCK | 2 μs  244.14 ps | 1900-01-01 から 2042-09-17 UTC |
| 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 (\*) | (\*) |
| C++ | std::chrono::system\_clock::now() | (\*) | (\*) |
| C# (Microsoft) | System.DateTime.Now  System.DateTime.UtcNow | 100 ns | 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 |
| FORTRAN | DATE\_AND\_TIME  SYSTEM\_CLOCK | (\*) | 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() | 1 ns | 任意 |
| 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 未満 | 2001-01-01 ±10,000年 |
| 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 | 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() | 1 μs (\*) | 1970-01-01 から 2038-01-19 |
| 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 | 100 ns | 0001-01-01 to 9999-12-31 |
| [DateTime]::Now  [DateTime]::UtcNow |
| Visual Basic .NET (Microsoft) | System.DateTime.Now  System.DateTime.UtcNow | 100 ns | 0001-01-01 to 9999-12-31 |