システム時間

Unixの日付コマンド

コンピューティングにおいて、システム時間はコンピュータ システムの時点の概念を表します。

システム時間は、システム クロックによって測定されます。システム クロックは通常、エポックと呼ばれる任意の開始日から経過したティックの数を単純にカウントする形で実装されています。たとえば、UnixおよびPOSIX準拠のシステムでは、うるう秒を除いて、1970 年 1 月 1 日 00:00:00 UTのUnix エポックの開始から経過した秒数としてシステム時間 (「Unix 時間」) をエンコードします。Windows 9xWindows 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 IIBBC MicroCommodore PETなどの初期モデルが含まれます。IBM PCおよびXTでは、オンボードバッテリバックアップ付きのリアルタイムクロックチップを搭載したアドオン周辺ボードが利用可能でしたが、マザーボードに日付/時刻ハードウェアを内蔵した最初の普及型PCはIBM ATでした。コンピュータネットワークが広く普及する以前は、システム時刻を記録していたほとんどのパーソナルコンピュータシステムは現地時間のみに基づいており、異なるタイムゾーンを考慮していませんでした。

現在の技術では、ほとんどの最新コンピューターが現地の常用時を追跡しており、VCRDVRケーブルテレビ受信機PDAポケベル携帯電話ファックス機、留守番電話、カメラ、カムコーダーセントラルエアコン電子レンジなど、他の多くの家庭用および個人用デバイスも同様です。

組み込みシステムRaspberry PiArduino、その他の類似システムなど)内で動作するマイクロコントローラは、必ずしも時刻を追跡するための内部ハードウェアを備えているわけではありません。このようなコントローラシステムの多くは、外部時刻を意識することなく動作します。外部時刻情報を必要とするシステムでは、通常、再起動時にタイムサーバーや外部クロックなどの外部ソースから現在時刻を取得するか、ユーザーに現在時刻を手動で入力するよう 促すことで、ベースタイムを初期化します。

実装

システムクロックは通常、プログラム可能なインターバルタイマーとして実装され、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:\>TIME10ミリ秒 1980年1月1日から2099年12月31日まで
INT 21h, AH=2Ch SYSTEM TIME[ 6 ] INT 21h, AH=2Ah SYSTEM DATE[ 7 ]
macOSiOSiPadOStvOSwatchOSvisionOS ( Apple ) CFAbsoluteTimeGetCurrent()[ 8 ]< 1 ms [ 9 ] [注 1 ]2001年1月1日 ±10,000年[ 9 ] [注 1 ]
オープンVMSSYS$GETTIM()100ナノ秒[ 10 ]1858年11月17日から7月31日まで 31,086 [ 11 ]
gettimeofday()1μs [ 12 ]1970年1月1日から2106年2月7日まで[ 13 ]
clock_gettime()1ナノ秒[ 12 ]
z/OSSTCK[ 14 ] : 7–187 2 −12 μs 244.14 ps [ 14 ] : 4–45, 4–46 1900年1月1日から2042年9月17日(UT)[ 15 ]
STCKE1900年1月1日から西暦36,765年まで[ 16 ]
UnixPOSIX ( Cの日付と時刻関数も参照) $datetime()1秒 (*) 32ビットtime_t: 1970年1月1日から2038年1月19日まで64ビットtime_t: 1970年1月1日から西暦292,277,026,596年12月4日まで
gettimeofday()1μs
clock_gettime()1ナノ秒
OS/2DosGetDateTime()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.Clock100 μs~20 ms(*) 1901年1月1日から2099年12月31日まで(*)
AWKsystime()1秒 (*)
BASIC真のBASICDATE、、DATE$TIMETIME$1秒 (*)
ビジネスベーシックDAYTIM0.1秒 (*)
CCの日付と時刻関数を参照) 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日まで
CICSASKTIME1ミリ秒 1900年1月1日
コボルFUNCTION CURRENT-DATE1秒 1601年1月1日
コモンリスプ(get-universal-time)1秒 1900年1月1日
Delphi (ボーランド) datetime1ミリ秒(浮動小数点) 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 ]

[ 34 ]

1970年1月1日
CPU_TIME1μs
行くtime.Now()1ナノ秒 0001年1月1日
ハスケルTime.getClockTime1ps(*) 1970年1月1日(*)
Data.Time.getCurrentTime1ps(*) 1858年11月17日(*)
ジャワjava.util.Date()System.currentTimeMillis()1ミリ秒 1970年1月1日
System.nanoTime()[ 35 ]1ナノ秒 恣意的[ 35 ]
Clock.systemUTC()[ 36 ]1ナノ秒 恣意的[ 37 ]
JavaScriptTypeScript(new Date()).getTime()Date.now()1ミリ秒 1970年1月1日
ジュリアDates.now()1ミリ秒 0000年1月1日[ 38 ]
Matlabnow1秒 0000年1月0日[ 39 ]
おたふく風邪$Hの略$HOROLOG1秒 1840年12月31日
ラボビューTick Count1ミリ秒 00:00:00.000 1904年1月1日
Get Date/Time in Seconds1ミリ秒 00:00:00.000 1904年1月1日
Objective-C[NSDate timeIntervalSinceReferenceDate]1ミリ秒未満[ 40 ]2001年1月1日 ±10,000年[ 40 ]
OCamlUnix.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
PHPtime()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)%TIME1秒 0001年1月1日から9999年12月31日まで
CURRENT(TIMESTAMP)%TIMESTAMP1μ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(クロノス)
SQLCURDATE()またはまたはCURRENT DATECURTIME()またはCURRENT TIMEGETDATE()またはGETUTCDATE()NOW()またはCURRENT TIMESTAMPSYSDATE()3ミリ秒 1753年1月1日から9999年12月31日まで(*)
1分 1900年1月1日から2079年6月6日まで
標準MLTime.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 PowerShellGet-Date[ 45 ] [ 46 ]100ナノ秒[ 20 ]0001年1月1日から9999年12月31日まで
[DateTime]::Now[ 18 ] [DateTime]::UtcNow[ 19 ]
ビジュアルベーシック.NETSystem.DateTime.Now[ 18 ] System.DateTime.UtcNow[ 19 ]100ナノ秒[ 20 ]0001年1月1日から9999年12月31日まで

参照

注記

  1. ^ a b Apple Developer Documentationでは、CFAbsoluteTime/CFTimeIntervalの精度と範囲について明確な記述がありません。ただし、CFRunLoopTimerCreateのドキュメントでは「最大1ミリ秒未満」の精度と記載されています。ただし、類似のNSTimeInterval型は互換性があるようで、精度と範囲が記載されています。
  2. ^ a b c d C標準ライブラリは、システム時刻値の解像度、エポック、範囲、データ型を具体的に指定していません。C++ライブラリはCライブラリを包含しているため、Cと同じシステム時刻実装を使用しています。

参考文献

  1. ^ Ralf D. Brown (2000). 「Int 0x1A, AH=0x00」 . Ralf Brownの割り込みリスト.
  2. ^ Ralf D. Brown (2000). 「Int 0x1A, AH=0x02」 . Ralf Brownの割り込みリスト.
  3. ^ Ralf D. Brown (2000). 「Int 0x1A, AH=0x04」 . Ralf Brownの割り込みリスト.
  4. ^ 「CP/M Plus (CP/M バージョン 3.0) オペレーティング システム ガイド」(PDF)
  5. ^ 「BDOS システムコール」
  6. ^ Ralf D. Brown (2000). 「Int 0x21, AH=0x2c」 . Ralf Brownの割り込みリスト.
  7. ^ Ralf D. Brown (2000). 「Int 0x21, AH=0x2a」 . Ralf Brownの割り込みリスト.
  8. ^ "CFAbsoluteTimeGetCurrent" . Apple Developer Documentation . 2007.
  9. ^ a b "CFRunLoopTimerCreate" . Apple Developer Documentation . 2025年8月5日閲覧。
  10. ^ルース・E・ゴールデンバーグ;ローレンス・J・ケナ。デニス E. デュマ (1991)。VAX/VMS の内部構造とデータ構造、バージョン 5.2。デジタルプレス。ISBN 978-1555580599
  11. ^ “Why is Wednesday, November 17, 1858 the base time for OpenVMS (VAX VMS)?”スタンフォード大学1997年7月24日. 1997年7月24日時点のオリジナルよりアーカイブ。 2020年1月8日閲覧
  12. ^ a b「OpenVMSシステム用VSI Cランタイムライブラリリファレンスマニュアル」(PDF) VSI、2020年11月。 2021年4月17日閲覧
  13. ^ 「OpenVMSと2038年」 HP 2021年4月17日閲覧
  14. ^ a b z/Architecture Principles of Operation (PDF) . ポキプシー、ニューヨーク:International Business Machines. 2007年。
  15. ^ IBM は将来のシステムで日付範囲を 2042 年以降に拡張する予定です。z /Architecture Principles of Operation、(Poughkeepsie、New York:International Business Machines、2007) 1-15、4-45 から 4-47。
  16. ^ 「拡張された64ビット時刻値」 IBM . 2021年4月18日閲覧。
  17. ^ Jonathan de Boyne Pollard. 「32ビットコマンドインタープリタ」。OS /2 Warp 4では、日付と時刻は2000年をはるかに超え、さらには2038年をはるかに超え、OS/2 Warp 4のリアルタイムクロックの限界である2079年まで対応可能です。
  18. ^ a b c「DateTime.Now プロパティ」。Microsoft Docs
  19. ^ a b c「DateTime.UtcNow プロパティ」。Microsoft Docs
  20. ^ a b c「DateTime.Ticks プロパティ」。Microsoft Docs
  21. ^ 「日付と時刻のサポート」。Embarcadero Developer Network。2013年。
  22. ^ "System.SysUtils.Time" . Embarcadero Developer Network . 2013.
  23. ^ "System.SysUtils.GetTime" . Embarcadero Developer Network . 2013.
  24. ^ "System.SysUtils.Date" .エンバカデロ開発者ネットワーク2013年。
  25. ^ "System.DateUtils.Today" . Embarcadero Developer Network . 2013年。
  26. ^ "System.DateUtils.Tomorrow" . Embarcadero Developer Network . 2013.
  27. ^ "System.DateUtils.Yesterday" . Embarcadero Developer Network . 2013.
  28. ^ "System.SysUtils.Now" . Embarcadero Developer Network . 2013年。
  29. ^ "System.SysUtils.DayOfWeek" . Embarcadero Developer Network . 2013.
  30. ^ "System.SysUtils.CurrentYear" . Embarcadero Developer Network . 2013.
  31. ^ a b c「Erlang における時刻と時刻修正www.erlang.org
  32. ^ 「XL2000: Officeスプレッドシートコンポーネントの初期日付がExcelと異なる」。Microsoftサポート。2003年。2007年10月24日時点のオリジナルからのアーカイブ。Microsoft Officeスプレッドシートコンポーネントでは、値0は1899年12月30日、値1は1899年12月31日と評価されます。…Excelでは、値0は1900年1月0日、値1は1900年1月1日と評価されます。
  33. ^ "SYSTEM_CLOCK" .インテル® Fortran コンパイラー 19.0 開発者ガイドおよびリファレンス. 2019年4月29日. 2019年7月23日閲覧
  34. ^ 「SYSTEM_CLOCK — 時間関数」 . GNU Fortranコンパイラ. 2011年10月27日閲覧
  35. ^ a b「System.nanoTime() メソッド」 . Java プラットフォーム、標準版 6: API 仕様. 2015年. 2019年7月23日閲覧
  36. ^ 「Clock.systemUTC() およびその他のメソッド」 . Java Platform, Standard Edition 8: API 仕様. 2014. 2015年1月15日閲覧
  37. ^ 「JSR-310 Java Time System」 . Java Platform, Standard Edition 8: API仕様. 2014年. 2015年1月15日閲覧
  38. ^ 「日付」 . Julia 1.12 ドキュメント. 2025年11月26日閲覧
  39. ^ 「Matlab ヘルプ」
  40. ^ a b「NSTimeInterval - Foundation」。Apple開発者ドキュメント
  41. ^ Douglas Wegscheild、R. Schertler、Jarkko Hietaniemi、「Time::HiRes」CPAN - 包括的な Perl アーカイブ ネットワーク。 2011年2011 年10 月 27 日に取得
  42. ^ 「タイムクラス」
  43. ^ Yugui (2010年8月18日). 「Ruby 1.9.2 がリリースされました」新しい 1.9.2 は、以下の変更点を除いて 1.9.1 とほぼ互換性があります。… 時刻が再実装されました。2038 年に関するバグが修正されました。
  44. ^ 「MIT/GNU Scheme 9.2: 15.5 日付と時刻」
  45. ^ 「Get-Dateコマンドレットの使用」。Microsoft Docs。2009年10月22日。 2019年7月23日閲覧
  46. ^ 「今週のWindows PowerShellヒント - 日付と時刻の書式設定」。Microsoft Docs。2010年5月26日。 2019年7月23日閲覧