系统时间

计算机科学与计算机编程中，系统时间表示在计算机系统中的时间与日期。通常用系统时钟（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时间对应于日历时间2001年9月9日 01:46:40 UT。 
 获取系统时间  
下述均采用格里高利历与。(*)表示依赖于系统实现。

  UTC 
操作系统

 操作系统 命令或函数 分辨率 或范围Android java.lang.System.currentTimeMillis()1 ms起始于1970年1月1日BIOS (IBM PC) INT 1Ah, AH=00hRalf Brown, "Int 0x1A, AH=0x00" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/00.html  54.931 ms 18.204 Hz  当天午夜 INT 1Ah, AH=02hRalf Brown, "Int 0x1A, AH=0x02" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/02.html  1 s 当天午夜 INT 1Ah, AH=04hRalf Brown, "Int 0x1A, AH=0x04" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/1A/04.html  1 day 1980年1月1日至1999年12月31日
或至2079年12月31日（视系统而定） CP/M Plus System Control Block: 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): word, Days since 1 January 1978 byte, Hour (BCD) byte, Minute (BCD) byte, Second (BCD) DOS (Microsoft) DATETIME 10 ms 1980年1月1日至2099年12月31日 INT 21h, AH=2Ch SYSTEM TIMERalf Brown, "Int 0x21, AH=0x2c" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2C.html INT 21h, AH=2Ah SYSTEM DATERalf Brown, "Int 0x21, AH=0x2a" in Ralf Brown's Interrupt List, 2000, http://www.delorie.com/djgpp/doc/rbinter/ix/21/2A.html  iOS (Apple) CFAbsoluteTimeGetCurrent()"Time Utilities Reference"  in iOS Developer Library (Apple, 2007). < 1 ms 2001年1月1日前后一万年 Mac OS (Apple) CFAbsoluteTimeGetCurrent()"Time Utilities Reference"  in Mac OS X Developer Library (Apple, 2007). < 1 ms"CFRunLoopTimer Reference"   in Mac OS X Developer Library (Apple, 2007).苹果开发者文档并没有清晰地说明CFAbsoluteTime/CFTimeInterval的精度和范围，只有在CFRunLoopTimerCreate方法中说明“精度最多在毫秒级”。然而，相似的，可以互换的类型NSTimeInterval  则列出了精度和范围。 2001年1月1日前后一万年 OpenVMS (HP) SYS$GETTIM() 100 ns 1858年11月17日至公元31086年 z/OS (IBM) STCKz/Architecture Principles of Operation (Poughkeepsie, New York:International Business Machines, 2007) 7-187. 2−12 μs 244.14 psz/Architecture Principles of Operation, (Poughkeepsie, New York:International Business Machines, 2000) 4-45, 4-46. 1900年1月1日至世界时2042年9月17日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. Unix, POSIX (参见C date and time functions) datetime() 1 s(*)
1970年1月1日至2038年1月19日1970年1月1日至公元292277026596年 () 1 μs () 1 ns Windows (Microsoft) GetSystemTime() 1 ms1601年1月1日至公元30828年 GetSystemTimeAsFileTime() 100 ns实际上Windows操作系统按照固定时间间隔返回系统时间。对于Windows NT 或 Server 2003是15.625 ms

程序设计语言与软件

 操作系统 命令或函数 分辨率 或范围 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 (*)  DAY, TIM 0.1 s (*) C (参见C date and time functions) time() 1 s (*)C标准库并没有为系统时间值指定特定的分辨率，历法，范围，和数据类型。而C++库则扩展自C库，所以同样跟随C的实现。 (*) C++ std::time()  std::chrono::system_clock::now() 1 s (*)1 ns (C++11, OS dependent) (*) C# (Microsoft) System.DateTime.Now"DateTime.Now Property"  in MSDN (Microsoft, 2010) last updated July 2010. System.DateTime.UtcNow"DateTime.UtcNow Property"  in MSDN (Microsoft, 2011) 100 ns"DateTime.Ticks Property  in MSDN (Microsoft, 2010) last updated May 2010. 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 毫秒级COleDateTime采用浮点数表示，整数部分表示日期；小数部分独立表示时分秒，例如6时整总是表示为0.25，不论整数部分的正负。因此1天间隔表示为1.0。1899年12月30日午夜表示为0.0。 100年1月1日-9999年12月31日 Common Lisp (get-universal-time) 1 s1900年1月1日 Delphi (Borland) datetime 1 ms (floating point)1900年1月1日 Delphi ()"Date and Time Support"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) System.SysUtils.Time"System.SysUtils.Time"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) 1 ms 0/0/0000 0:0:0:000至12/31/9999 23:59:59:999 [sic] System.SysUtils.GetTime"System.SysUtils.GetTime"  in Embarcadero Developer Network (Embarcadero Technologies, 2013)(alias for System.SysUtils.Time) System.SysUtils.Date"System.SysUtils.Date"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) 0/0/0000 0:0:0:000至12/31/9999 0:0:0:000 [sic] System.DateUtils.Today"System.DateUtils.Today"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) System.DateUtils.Tomorrow"System.DateUtils.Tomorrow"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) System.DateUtils.Yesterday"System.DateUtils.Yesterday"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) System.SysUtils.Now"System.SysUtils.Now"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) 1 s 0/0/0000 0:0:0:000至12/31/9999 23:59:59:000 [sic] System.SysUtils.DayOfWeek"System.SysUtils.DayOfWeek"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) 1 day 1至7 System.SysUtils.CurrentYear"System.SysUtils.CurrentYear"  in Embarcadero Developer Network (Embarcadero Technologies, 2013) 1 year (*) Emacs Lisp (current-time) 1 μs (*)1970年1月1日 Excel (Microsoft) date() ? 1900年1月0日"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). Fortran DATE_AND_TIME SYSTEM_CLOCK (*)"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.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 ms1970年1月1日 System.nanoTime()System.nanoTime() method  in Java Platform, Standard Edition 6: API Specification (Oracle, 2011) accessed 27 October 2011. 1 ns 任意的 Clock.systemUTC()Clock.systemUTC() and other methods  in Java Platform, Standard Edition 8: API Specification (Oracle, 2014) accessed 15 January 2015. 1 ns 任意的JSR-310 Java Time System  in Java Platform, Standard Edition 8: API Specification (Oracle, 2014) accessed 15 January 2015. JavaScript new Date() Date.getTime() 1 ms1970年1月1日 Matlab now 1 s 0000年1月0日  Matlab Help MUMPS $H (short for $HOROLOG) 1 s 1840年12月31日 Objective-C [NSDate timeIntervalSinceReferenceDate] < 1 ms"Foundation Data Types Reference"  in Mac OS X Developer Library (Apple, 2011) last modified 6 July 2011, section NSTimeInterval. 2001年1月1日前后1万年 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 s1970年1月1日 Time::HiRes::timeDouglas Wegscheild, R. Schertler,  and Jarkko Hietaniemi, "Time::HiRes"  (CPAN
Comprehensive Perl Archive Network, 2011) accessed 27 October 2011. 1 μs PHP time()mktime() 1 s1970年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()Time class  in Ruby-Doc.org: Help and documentation for the Ruby programming language (Scottsdale, AZ: James Britt and Neurogami) accessed 27 October 2011. 1 μs (*) 1970年1月1日（Ruby 1.9.2之前最长至2038年1月19日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.） Smalltalk Time microsecondClock  1 s  1 μs  1 s  1901年1月1日(*) Time totalSeconds  SystemClock ticksNowSinceSystemClockEpoch  SQL CURDATE() CURTIME() GETDATE() NOW() SYSDATE() 3 ms 1753年1月1日至9999年12月31日(*) MySQL的实现Oracle的实现为公元前4712年至公元9999年 60 s 1900年1月1日至2079年6月6日 Standard ML Time.now() 1 μs (*) 1970年1月1日(*) TCL [clock seconds] 1 s1970年1月1日 [clock milliseconds] 1 ms [clock microseconds] 1 μs [clock clicks] 1 μs (*) (*) Windows PowerShell Get-Date 100 ns0001年1月1日至9999年12月31日 [DateTime]::Now [DateTime]::UtcNow Visual Basic .NET (Microsoft) System.DateTime.Now System.DateTime.UtcNow 100 ns0001年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

注释

参考文献

外部链接
 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)

Category:操作系统技术
Category:计算机编程