系统时间

<image>

计算机科学与计算机编程中，系统时间表示在计算机系统中的时间与日期。通常用系统时钟（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时间1对应于日历时间2001年9月9日 01:46:40 UT。

## 获取系统时间

下述均采用格里高利历与外推格里高利历。(*)表示依赖于系统实现。

UTC 本网页生成时的系统时间 → 点击此处以刷新时间

### 操作系统

操作系统｜命令或函数｜分辨率｜时间起点或范围

Android｜java.lang.System.currentTimeMillis｜1 ms｜起始于1970年1月1日

BIOS (IBM PC)｜INT 1Ah, AH=00h｜54.931 ms 18.204 Hz｜当天午夜

INT 1Ah, AH=02h｜1 s｜当天午夜

INT 1Ah, AH=04h｜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)｜C:\>DATEC:\>TIME｜10 ms｜1980年1月1日至2099年12月31日

INT 21h, AH=2Ch SYSTEM TIMEINT 21h, AH=2Ah SYSTEM DATE

iOS (Apple)｜CFAbsoluteTimeGetCurrent｜< 1 ms｜2001年1月1日前后一万年

Mac OS (Apple)｜CFAbsoluteTimeGetCurrent｜< 1 ms｜2001年1月1日前后一万年

OpenVMS (HP)｜SYS$GETTIM｜100 ns｜1858年11月17日至公元31086年

z/OS (IBM)｜STCK｜2−12 μs 244.14 ps｜1900年1月1日至世界时2042年9月17日

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 ms｜1601年1月1日至公元30828年

GetSystemTimeAsFileTime｜100 ns

### 程序设计语言与软件

操作系统｜命令或函数｜分辨率｜时间起点或范围

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 (、)｜(、)

C++｜std::time std::chrono::system_clock::now｜1 s (、)1 ns (C++11, OS dependent)｜(、)

C# (Microsoft)｜System.DateTime.Now System.DateTime.UtcNow｜100 ns｜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｜毫秒级｜100年1月1日-9999年12月31日

Common Lisp｜(get-universal-time)｜1 s｜1900年1月1日

Delphi (Borland)｜datetime｜1 ms (floating point)｜1900年1月1日

Delphi (Embarcadero Technologies)｜System.SysUtils.Time｜1 ms｜0/0/0000 0:0:0:000至12/31/9999 23:59:59:999 sic

System.SysUtils.GetTime(alias for System.SysUtils.Time)

System.SysUtils.Date｜0/0/0000 0:0:0:000至12/31/9999 0:0:0:000 sic

System.DateUtils.Today System.DateUtils.Tomorrow System.DateUtils.Yesterday

System.SysUtils.Now｜1 s｜0/0/0000 0:0:0:000至12/31/9999 23:59:59:000 sic

System.SysUtils.DayOfWeek｜1 day｜1至7

System.SysUtils.CurrentYear｜1 year｜(、)

Emacs Lisp｜(current-time)｜1 μs (、)｜1970年1月1日

Excel (Microsoft)｜date｜?｜1900年1月0日

Fortran｜DATE_AND_TIME SYSTEM_CLOCK｜(、) ｜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.DateSystem.currentTimeMillis｜1 ms｜1970年1月1日

System.nanoTime｜1 ns｜任意的

Clock.systemUTC｜1 ns｜任意的

JavaScript｜new Date Date.getTime｜1 ms｜1970年1月1日

Matlab｜now｜1 s｜0000年1月0日

MUMPS｜$H (short for $HOROLOG)｜1 s｜1840年12月31日

Objective-C｜NSDate timeIntervalSinceReferenceDate｜< 1 ms｜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 s｜1970年1月1日

Time::HiRes::time｜1 μs

PHP｜timemktime｜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｜1 μs (、)｜1970年1月1日（Ruby 1.9.2之前最长至2038年1月19日）

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日(、)

60 s｜1900年1月1日至2079年6月6日

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｜100 ns｜0001年1月1日至9999年12月31日

DateTime::Now DateTime::UtcNow

Visual Basic .NET (Microsoft)｜System.DateTime.Now System.DateTime.UtcNow｜100 ns｜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

## 外部链接

- 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)