System time
In computer science and computer programming, system time represents a computer system's notion of the passing of time. In this sense, time also includes the passing of days on the calendar.
System time is measured by a system clock, which is typically implemented as a simple count of the number of ticks that have transpired since some arbitrary starting date, called the epoch. For example, Unix and POSIX-compliant systems encode system time ("Unix time") as the number of seconds elapsed since the start of the Unix epoch at 1 January 1970 00:00:00 UT, with exceptions for leap seconds. Systems that implement the 32-bit and 64-bit versions of the Windows API, such as Windows 9x and Windows NT, provide the system time as both SYSTEMTIME, represented as a year/month/day/hour/minute/second/milliseconds value, and FILETIME, represented as a count of the number of 100-nanosecond ticks since 1 January 1601 00:00:00 UT as reckoned in the proleptic Gregorian calendar.
System time can be converted into calendar time, which is a form more suitable for human comprehension. For example, the Unix system time 1000000000 seconds since the beginning of the epoch translates into the calendar time 9 September 2001 01:46:40 UT. Library subroutines that handle such conversions may also deal with adjustments for timezones, daylight saving time (DST), leap seconds, and the user's locale settings. Library routines are also generally provided that convert calendar times into system times.
Other time measurements
Closely related to system time is process time, which is a count of the total CPU time consumed by an executing process. It may be split into user and system CPU time, representing the time spent executing user code and system kernel code, respectively. Process times are a tally of CPU instructions or clock cycles and generally have no direct correlation to wall time.
File systems keep track of the times that files are created, modified, and/or accessed by storing timestamps in the file control block (or inode) of each file and directory.
History
Most first-generation PCs did not keep track of dates and times. These included systems that ran the CP/M operating system, as well as early models of the Apple II, the BBC Micro and the Commodore PET, among others. The IBM AT was the first widely available personal computer that came equipped with date/time hardware built into the motherboard. Add-on peripheral boards included real-time clock chips with on-board battery back-up was also available for the IBM PC and XT. Prior to the widespread availability of computer networks, most personal computer systems that did track system time did so only with respect to local time and did not make allowances for other time zones.
With current technology, most modern computers keep track of local civil time, as do many other household and personal devices such as VCRs, DVRs, cable TV receivers, PDAs, pagers, cell phones, fax machines, telephone answering machines, cameras, camcorders, central air conditioners, and microwave ovens.
Microcontrollers operating within embedded systems (such as the Raspberry Pi, Arduino, and other similar systems) do not always have internal hardware to keep track of time. Many such controller systems operate without knowledge of the external time. Those that do require such information typically initialize their base time upon rebooting by obtaining the current time from an external source, such as from a time server or external clock, or by prompting the user to manually enter the current time.
Implementation
The system clock is typically implemented as a programmable interval timer that periodically interrupts the CPU, which then starts executing a timer interrupt service routine. That routine typically adds one tick to the system clock (a simple counter) and handles other periodic housekeeping tasks (preemption, etc.) before returning to whatever the CPU was doing before the interruption.
Retrieving system time
The following tables illustrate methods for retrieving the system time in various operating systems, programming languages, and applications. Values marked by (*) are system-dependent and may differ across implementations. All dates are given as Gregorian or proleptic Gregorian calendar dates.
Note that the resolution of an implementation's measurement of time does not imply the same accuracy of such measurements. For example, a system might return the current time as a value measured in microseconds, but actually be capable of discerning individual clock ticks with a frequency of only 100 Hz (10 ms).
Operating systems
Operating system | Command or function | Resolution | Epoch or range |
---|---|---|---|
Android | java.lang |
1 ms | 1 January 1970 |
BIOS (IBM PC) | INT 1Ah, AH=00h[1] | 54.931 ms 18.204 Hz |
Midnight of the current day |
INT 1Ah, AH=02h[2] | 1 s | Midnight of the current day | |
INT 1Ah, AH=04h[3] | 1 day | 1 January 1980 to 31 December 1999 or 31 December 2079 (system dependent) | |
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 | 1 January 1978 to September 2067 |
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 | 1 January 1980 to 31 December 2099 |
INT 21h, AH=2Ch SYSTEM TIME[6] INT 21h, AH=2Ah SYSTEM DATE[7] | |||
iOS (Apple) | CFAbsoluteTimeGetCurrent()[8] | < 1 ms | 1 January 2001 ±10,000 years |
Mac OS (Apple) | CFAbsoluteTimeGetCurrent()[9] | < 1 ms[10][note 1] | 1 January 2001 ±10,000 years[10][note 1] |
OpenVMS (HP) | SYS$GETTIM() | 100 ns | 17 November 1858 to AD 31,086 |
z/OS (IBM) | STCK[11] | 2−12 μs 244.14 ps[12] |
1 January 1900 to 17 September 2042 UT[13] |
Unix, POSIX (see also C date and time functions) |
$date time() |
1 s | (*) 1 January 1970 to 19 January 2038 1 January 1970 to AD 292,277,026,596 |
() | 1 μs | ||
() | 1 ns | ||
Windows (Microsoft) | GetSystemTime() | 1 ms | 1 January 1601 to AD 30,828 |
GetSystemTimeAsFileTime() | 100 ns |
Programming languages and applications
Language/Application | Function or variable | Resolution | Epoch or range |
---|---|---|---|
Ada | Ada.Calendar.Clock | 100 μs to 20 ms (*) |
1 January 1901 to 31 December 2099 (*) |
AWK | systime() | 1 s | (*) |
BASIC, True BASIC | DATE, DATE$ TIME, TIME$ |
1 s | (*) |
Business BASIC | DAY, TIM | 0.1 s | (*) |
C (see 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[14] System.DateTime.UtcNow[15] |
100 ns[16] | 1 January 0001 to 31 December 9999 |
CICS (IBM) | ASKTIME | 1 ms | 1 January 1900 |
COBOL | FUNCTION CURRENT-DATE | 1 s | 1 January 1601 |
Common Lisp | (get-universal-time) | 1 s | 1 January 1900 |
Delphi (Borland) | date time |
1 ms (floating point) |
1 January 1900 |
Delphi (Embarcadero Technologies)[17] |
System.SysUtils.Time[18] | 1 ms | 0/0/0000 0:0:0:000 to 12/31/9999 23:59:59:999 [sic] |
System.SysUtils.GetTime[19] (alias for System.SysUtils.Time) | |||
System.SysUtils.Date[20] | 0/0/0000 0:0:0:000 to 12/31/9999 0:0:0:000 [sic] | ||
System.DateUtils.Today[21] | |||
System.DateUtils.Tomorrow[22] | |||
System.DateUtils.Yesterday[23] | |||
System.SysUtils.Now[24] | 1 s | 0/0/0000 0:0:0:000 to 12/31/9999 23:59:59:000 [sic] | |
System.SysUtils.DayOfWeek[25] | 1 day | 1 to 7 | |
System.SysUtils.CurrentYear[26] | 1 year | (*) | |
Emacs Lisp | (current-time) | 1 μs (*) | 1 January 1970 |
Erlang (Ericsson) | erlang:system_time(), os:system_time()[27] | OS dependent, e.g. on Linux 1ns[27] | 1 January 1970[27] |
Excel (Microsoft) | date() | ? | 0 January 1900[28] |
Fortran | DATE_AND_TIME SYSTEM_CLOCK |
(*)[29] | 1 January 1970 |
CPU_TIME | 1 μs | ||
Go | time.Now() | 1 ns | 1 January 0001 |
Haskell | Time.getClockTime | 1 ps (*) | 1 January 1970 (*) |
Data.Time.getCurrentTime | 1 ps (*) | 17 November 1858 (*) | |
Java (Sun) | java.util.Date() System.currentTimeMillis() |
1 ms | 1 January 1970 |
System.nanoTime()[31] | 1 ns | arbitrary[31] | |
Clock.systemUTC()[32] | 1 ns | arbitrary[33] | |
JavaScript | new Date() Date.getTime() |
1 ms | 1 January 1970 |
Matlab | now | 1 s | 0 January 0000[34] |
MUMPS | $H (short for $HOROLOG) | 1 s | 31 December 1840 |
Objective-C | [NSDate timeIntervalSinceReferenceDate] | < 1 ms[35] | 1 January 2001 ±10,000 Years[35] |
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 | 1 January 1970 |
Time::HiRes::time[36] | 1 μs | ||
PHP | time() mktime() |
1 s | 1 January 1970 |
microtime() | 1 μs | ||
Python | time.time() | 1 μs (*) | 1 January 1970 |
RPG | CURRENT(DATE), %DATE CURRENT(TIME), %TIME |
1 s | 1 January 0001 to 31 December 9999 |
CURRENT(TIMESTAMP), %TIMESTAMP | 1 μs | ||
Ruby | Time.now()[37] | 1 μs (*) | 1 January 1970 (to 19 January 2038 prior to Ruby 1.9.2[38]) |
Smalltalk | Time microsecondClock (VisualWorks) |
1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) |
1 January 1901 (*) |
Time totalSeconds (Squeak) | |||
SystemClock ticksNowSinceSystemClockEpoch (Chronos) | |||
SQL | CURDATE() CURTIME() GETDATE() NOW() SYSDATE() |
3 ms | 1 January 1753 to 31 December 9999 (*) |
60 s | 1 January 1900 to 6 June 2079 | ||
Standard ML | Time.now() | 1 μs (*) | 1 January 1970 (*) |
TCL | [clock seconds] | 1 s | 1 January 1970 |
[clock milliseconds] | 1 ms | ||
[clock microseconds] | 1 μs | ||
[clock clicks] | 1 μs (*) | (*) | |
Windows PowerShell | Get-Date[39][40] | 100 ns[16] | 1 January 0001 to 31 December 9999 |
[DateTime]::Now[14] [DateTime]::UtcNow[15] | |||
Visual Basic .NET (Microsoft) | System.DateTime.Now[14] System.DateTime.UtcNow[15] |
100 ns[16] | 1 January 0001 to 31 December 9999 |
See also
- Calendar
- Computation time
- DATE (command)
- Epoch
- GPS time
- Jiffy
- Network Time Protocol
- Process
- rdate
- TIME (command)
- time.h
- time_t
- Time formatting and storage bugs
- TIME protocol
- Time-sharing
- Time standard
- Timer
- Timestamp
- Unix date command
- Unix time
- Unix time command
- Wall clock time
- Year 2000 problem
- Year 2038 problem
Notes
- 1 2 The Apple Developer Documentation is not clear on the precision & range of CFAbsoluteTime/CFTimeInterval, except in the CFRunLoopTimerCreate documentation which refers to 'sub-millisecond at most' precision. However, the similar type NSTimeInterval appears to be interchangeable, and has the precision and range listed.
- 1 2 3 4 The C standard library does not specify any specific resolution, epoch, range, or datatype for system time values. The C++ library encompasses the C library, so it uses the same system time implementation as C.
References
- ↑ 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).
- ↑ "BDOS system calls".
- ↑ 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).
- 1 2 "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.
- 1 2 3 "DateTime.Now Property" in MSDN (Microsoft, 2010) last updated July 2010.
- 1 2 3 "DateTime.UtcNow Property" in MSDN (Microsoft, 2011)
- 1 2 3 "DateTime.Ticks Property in MSDN (Microsoft, 2010) last updated May 2010.
- ↑ "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)
- 1 2 3 Time and Time Correction in Erlang
- ↑ "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.
- 1 2 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.
- ↑ Matlab Help
- 1 2 "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. Retrieved 11 December 2013.
- ↑ "Windows PowerShell Tip of the Week – Formatting Dates and Times". Microsoft TechNet. Retrieved 11 December 2013.
External links
- 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)