系統時間
外觀
電腦科學與電腦編程中,系統時間表示在電腦系統中的時間與日期。通常用系統時鐘(system clock)從某個時間起點的嘀嗒數(number of ticks)。例如,類Unix系統採用世界標準時1970年1月1日00:00:00開始的秒數(不考慮閏秒)作為UNIX時間。Windows API使用SYSTEMTIME表示年月日時分秒毫秒;使用FILETIME表示自世界標準時1601年1月1日00:00:00開始的100奈秒為單位的時鐘嘀嗒數。
系統時間可以轉化為日曆時間以適合人去理解。例如Unix時間1000000000對應於日曆時間2001年9月9日 01:46:40 UT。
取得系統時間
[編輯]下述均採用格里高利曆與外推格里高利曆。(*)表示依賴於系統實現。
作業系統
[編輯]作業系統 | 命令或函式 | 解析度 | 時間起點或範圍 |
---|---|---|---|
Android | java.lang |
1 ms | 起始於1970年1月1日 |
BIOS (IBM PC) | INT 1Ah, AH=00h[1] | 54.931 ms 18.204 Hz |
當天午夜 |
INT 1Ah, AH=02h[2] | 1 s | 當天午夜 | |
INT 1Ah, AH=04h[3] | 1 day | 1980年1月1日至1999年12月31日
或至2079年12月31日(視系統而定) | |
CP/M Plus | System Control Block:[4] scb$base+58h, Days since 1 Jan 1978 scb$base+5Ah, Hour (BCD) scb$base+5Bh, Minute (BCD) scb$base+5Ch, Second (BCD) |
1 s | 1978年1月1日至2067年12月 |
BDOS function 69h (T_GET):[5] word, Days since 1 January 1978 byte, Hour (BCD) byte, Minute (BCD) byte, Second (BCD) | |||
DOS (Microsoft) | C:\>DATE C:\>TIME |
10 ms | 1980年1月1日至2099年12月31日 |
INT 21h, AH=2Ch SYSTEM TIME[6] INT 21h, AH=2Ah SYSTEM DATE[7] | |||
iOS (Apple) | CFAbsoluteTimeGetCurrent()[8] | < 1 ms | 2001年1月1日前後一萬年 |
Mac OS (Apple) | CFAbsoluteTimeGetCurrent()[9] | < 1 ms[10][note 1] | 2001年1月1日前後一萬年[10][note 1] |
OpenVMS (HP) | SYS$GETTIM() | 100 ns | 1858年11月17日至公元31086年 |
z/OS (IBM) | STCK[11] | 2−12 μs 244.14 ps[12] |
1900年1月1日至世界時2042年9月17日[13] |
Unix, POSIX (參見C date and time functions) |
$date time() |
1 s | (*)
1970年1月1日至2038年1月19日 |
() | 1 μs | ||
() | 1 ns | ||
Windows (Microsoft) | GetSystemTime() | 1 ms | 1601年1月1日至公元30828年 |
GetSystemTimeAsFileTime() | 100 ns[14] |
程式設計語言與軟體
[編輯]作業系統 | 命令或函式 | 解析度 | 時間起點或範圍 |
---|---|---|---|
Ada | Ada.Calendar.Clock | 100 μs to 20 ms (*) |
1901年1月1日至2099年12月31日(*) |
AWK | systime() | 1 s | (*) |
BASIC, True BASIC | DATE, DATE$ TIME, TIME$ |
1 s | (*) |
Business BASIC | DAY, TIM | 0.1 s | (*) |
C (參見C date and time functions) | time() | 1 s (*)[note 2] | (*)[note 2] |
C++ | std::time() std::chrono::system_clock::now() |
1 s (*)[note 2] 1 ns (C++11, OS dependent) |
(*)[note 2] |
C# (Microsoft) | System.DateTime.Now[15] System.DateTime.UtcNow[16] |
100 ns[17] | 0001年1月1日至9999年12月31日 |
CICS (IBM) | ASKTIME | 1 ms | 1900年1月1日 |
COBOL | FUNCTION CURRENT-DATE | 1 s | 1601年1月1日 |
COM | COleDateTime | 毫秒級[18] | 100年1月1日-9999年12月31日 |
Common Lisp | (get-universal-time) | 1 s | 1900年1月1日 |
Delphi (Borland) | date time |
1 ms (floating point) |
1900年1月1日 |
Delphi (Embarcadero Technologies)[19] |
System.SysUtils.Time[20] | 1 ms | 0/0/0000 0:0:0:000至12/31/9999 23:59:59:999 [sic] |
System.SysUtils.GetTime[21](alias for System.SysUtils.Time) | |||
System.SysUtils.Date[22] | 0/0/0000 0:0:0:000至12/31/9999 0:0:0:000 [sic] | ||
System.DateUtils.Today[23] | |||
System.DateUtils.Tomorrow[24] | |||
System.DateUtils.Yesterday[25] | |||
System.SysUtils.Now[26] | 1 s | 0/0/0000 0:0:0:000至12/31/9999 23:59:59:000 [sic] | |
System.SysUtils.DayOfWeek[27] | 1 day | 1至7 | |
System.SysUtils.CurrentYear[28] | 1 year | (*) | |
Emacs Lisp | (current-time) | 1 μs (*) | 1970年1月1日 |
Excel (Microsoft) | date() | ? | 1900年1月0日[29] |
Fortran | DATE_AND_TIME SYSTEM_CLOCK |
(*)[30] | 1970年1月1日 |
CPU_TIME | 1 μs | ||
Go | time.Now() | 1 ns | 0001年1月1日 |
Haskell | Time.getClockTime | 1 ps (*) | 1970年1月1日 (*) |
Data.Time.getCurrentTime | 1 ps (*) | 1858年11月17日(*) | |
Java (Sun) | java.util.Date() System.currentTimeMillis() |
1 ms | 1970年1月1日 |
System.nanoTime()[32] | 1 ns | 任意的[32] | |
Clock.systemUTC()[33] | 1 ns | 任意的[34] | |
JavaScript | new Date() Date.getTime() |
1 ms | 1970年1月1日 |
Matlab | now | 1 s | 0000年1月0日[35] |
MUMPS | $H (short for $HOROLOG) | 1 s | 1840年12月31日 |
Objective-C | [NSDate timeIntervalSinceReferenceDate] | < 1 ms[36] | 2001年1月1日前後1萬年[36] |
OCaml | Unix.time() | 1 s | 1 January 1970 |
Unix.gettimeofday() | 1 μs | ||
Extended Pascal | GetTimeStamp() | 1 s | (*) |
Turbo Pascal | GetTime() GetDate() |
10 ms | (*) |
Perl | time() | 1 s | 1970年1月1日 |
Time::HiRes::time[37] | 1 μs | ||
PHP | time() mktime() |
1 s | 1970年1月1日 |
microtime() | 1 μs | ||
Python | time.time() | 1 μs (*) | 1970年1月1日 |
RPG | CURRENT(DATE), %DATE CURRENT(TIME), %TIME |
1 s | 0001年1月1日至9999年12月31日 |
CURRENT(TIMESTAMP), %TIMESTAMP | 1 μs | ||
Ruby | Time.now()[38] | 1 μs (*) | 1970年1月1日(Ruby 1.9.2之前最長至2038年1月19日[39]) |
Smalltalk | Time microsecondClock (VisualWorks) |
1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) |
1901年1月1日(*) |
Time totalSeconds (Squeak) | |||
SystemClock ticksNowSinceSystemClockEpoch (Chronos) | |||
SQL | CURDATE() CURTIME() GETDATE() NOW() SYSDATE() |
3 ms | 1753年1月1日至9999年12月31日(*) [note 3][note 4] |
60 s | 1900年1月1日至2079年6月6日[note 3] | ||
Standard ML | Time.now() | 1 μs (*) | 1970年1月1日(*) |
TCL | [clock seconds] | 1 s | 1970年1月1日 |
[clock milliseconds] | 1 ms | ||
[clock microseconds] | 1 μs | ||
[clock clicks] | 1 μs (*) | (*) | |
Windows PowerShell | Get-Date[40][41] | 100 ns[17] | 0001年1月1日至9999年12月31日 |
[DateTime]::Now[15] [DateTime]::UtcNow[16] | |||
Visual Basic .NET (Microsoft) | System.DateTime.Now[15] System.DateTime.UtcNow[16] |
100 ns[17] | 0001年1月1日至9999年12月31日 |
不同時間的轉換
[編輯]Windows API提供下述資料結構表示時間:
- FILETIME:64位元整型值,表示自UTC1601年1月1日開始的每100奈秒的計數。
- SYSTEMTIME:精度到毫秒。
- time_t:64位元整型值,表示自UTC1970年1月1日開始的秒的計數。
- struct tm:精度到秒
- 高解析度效能計數器(high-resolution performance counter):每秒的滴答數。
Windows API提供下述函式:
- 本地時間與系統時間之間的轉換:SystemTimeToTzSpecificLocalTime、TzSpecificLocalTimeToSystemTime
- 系統時間與檔案時間的轉換:SystemTimeToFileTime、FileTimeToSystemTime
- 本地時間與檔案時間的轉換:LocalFileTimeToFileTime、FileTimeToLocalFileTime
注釋
[編輯]- ^ 1.0 1.1 蘋果開發者文件並沒有清晰地說明CFAbsoluteTime/CFTimeInterval的精度和範圍,只有在CFRunLoopTimerCreate方法中說明「精度最多在毫秒級」。然而,相似的,可以互換的類型NSTimeInterval (頁面存檔備份,存於網際網路檔案館) 則列出了精度和範圍。
- ^ 2.0 2.1 2.2 2.3 C標準庫並沒有為系統時間值指定特定的解析度,曆法,範圍,和資料類型。而C++庫則擴充自C庫,所以同樣跟隨C的實現。
- ^ 3.0 3.1 MySQL的實現
- ^ Oracle的實現為公元前4712年至公元9999年
參考文獻
[編輯]- ^ Ralf Brown, "Int 0x1A, AH=0x00" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/00.html (頁面存檔備份,存於網際網路檔案館)
- ^ 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 0x1A, AH=0x04" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/04.html (頁面存檔備份,存於網際網路檔案館)
- ^ CP/M Plus (CP/M Version 3.0) Operating System Guide (PDF). [2016-08-14]. (原始內容存檔 (PDF)於2016-12-27).
- ^ BDOS system calls. [2016-08-14]. (原始內容存檔於2017-08-19).
- ^ Ralf Brown, "Int 0x21, AH=0x2c" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2C.html (頁面存檔備份,存於網際網路檔案館)
- ^ Ralf Brown, "Int 0x21, AH=0x2a" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2A.html (頁面存檔備份,存於網際網路檔案館)
- ^ "Time Utilities Reference" (頁面存檔備份,存於網際網路檔案館) in iOS Developer Library (Apple, 2007).
- ^ "Time Utilities Reference" (頁面存檔備份,存於網際網路檔案館) in Mac OS X Developer Library (Apple, 2007).
- ^ 10.0 10.1 "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, 2000) 4-45, 4-46.
- ^ IBM intends to extend the date range on future systems beyond 2042. z/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2007) 1-15, 4-45 to 4-47.
- ^ 實際上Windows作業系統按照固定時間間隔返回系統時間。對於Windows NT 或 Server 2003是15.625 ms
- ^ 15.0 15.1 15.2 "DateTime.Now Property" (頁面存檔備份,存於網際網路檔案館) in MSDN (Microsoft, 2010) last updated July 2010.
- ^ 16.0 16.1 16.2 "DateTime.UtcNow Property" (頁面存檔備份,存於網際網路檔案館) in MSDN (Microsoft, 2011)
- ^ 17.0 17.1 17.2 "DateTime.Ticks Property (頁面存檔備份,存於網際網路檔案館) in MSDN (Microsoft, 2010) last updated May 2010.
- ^ COleDateTime採用浮點數表示,整數部分表示日期;小數部分獨立表示時分秒,例如6時整總是表示為0.25,不論整數部分的正負。因此1天間隔表示為1.0。1899年12月30日午夜表示為0.0。
- ^ "Date and Time Support" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.Time" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.GetTime" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.Date" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.DateUtils.Today" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.DateUtils.Tomorrow" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.DateUtils.Yesterday" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.Now" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.DayOfWeek" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "System.SysUtils.CurrentYear" (頁面存檔備份,存於網際網路檔案館) in Embarcadero Developer Network (Embarcadero Technologies, 2013)
- ^ "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." XL2000: Early Dates on Office Spreadsheet Component Differ from Excel (頁面存檔備份,存於網際網路檔案館) in (Microsoft Support, 2003).
- ^ "SYSTEM_CLOCK" (頁面存檔備份,存於網際網路檔案館), documentation for FORTRAN compiler, Intel Corp., accessed 27 October 2011.
- ^ SYSTEM_CLOCK — Time function" (頁面存檔備份,存於網際網路檔案館) in The GNU Fortran Compiler (Free Software Foundation) accessed 27 October 2011.
- ^ 32.0 32.1 System.nanoTime() method (頁面存檔備份,存於網際網路檔案館) in Java Platform, Standard Edition 6: API Specification (Oracle, 2011) accessed 27 October 2011.
- ^ Clock.systemUTC() and other methods (頁面存檔備份,存於網際網路檔案館) in Java Platform, Standard Edition 8: API Specification (Oracle, 2014) accessed 15 January 2015.
- ^ JSR-310 Java Time System (頁面存檔備份,存於網際網路檔案館) in Java Platform, Standard Edition 8: API Specification (Oracle, 2014) accessed 15 January 2015.
- ^ [1] (頁面存檔備份,存於網際網路檔案館) Matlab Help
- ^ 36.0 36.1 "Foundation Data Types Reference" (頁面存檔備份,存於網際網路檔案館) in Mac OS X Developer Library (Apple, 2011) last modified 6 July 2011, section NSTimeInterval.
- ^ Douglas Wegscheild, R. Schertler, and Jarkko Hietaniemi, "Time::HiRes" (頁面存檔備份,存於網際網路檔案館) (CPAN Comprehensive Perl Archive Network, 2011) accessed 27 October 2011.
- ^ Time class (頁面存檔備份,存於網際網路檔案館) in Ruby-Doc.org: Help and documentation for the Ruby programming language (Scottsdale, AZ: James Britt and Neurogami) accessed 27 October 2011.
- ^ Ruby 1.9.2 Release Notes (頁面存檔備份,存於網際網路檔案館) in Ruby-Doc.org: Help and documentation for the Ruby programming language (Scottsdale, AZ: James Britt and Neurogami) accessed 27 October 2011.
- ^ Using the Get-Date Cmdlet. Microsoft TechNet. [11 December 2013]. (原始內容存檔於2017-08-01).
- ^ Windows PowerShell Tip of the Week – Formatting Dates and Times. Microsoft TechNet. [11 December 2013]. (原始內容存檔於2017-07-31).
外部連結
[編輯]- Critical and Significant Dates (頁面存檔備份,存於網際網路檔案館), J. R. Stockton (retrieved 3 December 2015)
- The Boost Date/Time Library (頁面存檔備份,存於網際網路檔案館) (C++)
- The Boost Chrono Library (C++)
- The Chronos Date/Time Library (Smalltalk)
- Joda Time (頁面存檔備份,存於網際網路檔案館), The Joda Date/Time Library (Java)
- The Perl DateTime Project (頁面存檔備份,存於網際網路檔案館) (Perl)
- The Ruby Date/Time Library (頁面存檔備份,存於網際網路檔案館) (Ruby)