Questions tagged [unix-timestamp]

The number of seconds between a particular date and the Unix Epoch on January 1st, 1970

POSIX definition

The POSIX.1 definition of Unix time is a number which is zero at the Unix epoch (1970-01-01T00:00:00Z), and increases by exactly 86 400 per day. Epoch and day ordinals are based on UTC.

The subtlety in this definition comes from the fact that days aren't exactly 86 400 seconds long. POSIX timestamps grow at 1Hz during the day, then end the day with small jumps to adjust for the duration of the UTC day.

For example, 2004-09-16T00:00:00Z, 12 677 days after the epoch, is represented by the Unix time number 12 677 × 86 400 = 1 095 292 800. The time interval between the epoch and 2004-09-16T00:00:00Z actually lasted 12 677 × 86 400 + 22 seconds.

This definition can be extended to represent instants before the epoch using negative numbers. 1957-10-04T00:00:00Z, 4 472 days before the epoch, is represented by the Unix time number -4 472 × 86 400 = -386 380 800. UTC is not defined for these instants, but universal time (any time standard that counts days from midnight at the reference meridian, such as the Julian Day) can be used, and the reduced accuracy is unlikely to matter.

POSIX provides for sub-second resolution with struct timespec, a fixed point format with a tv_nsec struct member for nanoseconds. This format is useful for system interfaces, but unsuitable for serialisation (naive range-checking could leave holes).

POSIX timestamps are ambiguous, discontinuous, and non-monotonic across leap seconds. When a leap second is inserted, a 1s range of Unix timestamps is repeated, first representing the leap second, then representing the first second of the next day (some implementations repeat the timestamp range immediately before the leap second instead). In the theoretical case of negative leap seconds, there would be 1s ranges of Unix time that do not represent any instant in time. The rest of the time, these Unix timestamps are continuous, unambiguous, and grow monotonically by 1s every second. The ambiguity isn't introduced by UTC, which measures time broken down in components and not as a single number.

System timestamps

On Unix systems, the CLOCK_REALTIME clock represents Unix time on a best-effort basis, based on hardware and network support. It may jump if the system clock is too far from reference time. Different clocks, representing different notions of system time, are exposed through clock_gettime. On Linux, CLOCK_MONOTONIC is monotonic and continuous (with no time elapsing when the system is suspended). It may speed up or slow down when adjtime is called, typically through NTP steering (clock slew). CLOCK_BOOTTIME is also monotonic, but will continue growing when the system is suspended. CLOCK_MONOTONIC_RAW is like CLOCK_MONOTONIC, but matches the speed of the hardware clock and ignores adjtime adjustments to clock speed. CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID count CPU time consumed by the process and thread, respectively. Linux also provides coarse variants that may provide better performance.

Timestamps recorded by the kernel (for example, modification times on filesystem inodes) follow the CLOCK_REALTIME clock.

Assuming CLOCK_REALTIME follows POSIX time, getting unambiguous time (UTC or TAI) from the kernel is an unsolved problem; adjtimex might expose enough internal state but it is highly implementation dependent. Breaking from the standard brings its own tradeoffs.

Alternative timestamps

POSIX.1b-1993 switched the definition of Unix timestamps away from a simple second count from the epoch. This introduced a few drawbacks: timestamps do not represent instants unambiguously, and Unix time is discontinuous and jumps backwards. The jumps are rare, thus hard to test for. Bugs can be subtle and are most likely to be discovered in production, after developers have moved on.

TAI-10 (TAI minus ten seconds) hits midnight at the Unix epoch. TAI is an ideal timestamp format; it grows perfectly linearly at 1/s.

Redefining CLOCK_REALTIME to follow an alternative to POSIX time is doable, but not advisable unless you control the system entirely. Setting the clock to TAI-10, applications that use localtime will still work, with /etc/localtime pointing to the Olson "right" timezones, but many applications expect to compute UTC days from timestamp / 86_400. Redefining CLOCK_REALTIME indirectly, through a tweaked NTP server, is more feasible; many applications will survive slightly varying clock speeds. This is the leap smear technique, which silently replaces UTC with UTC-SLS (smoothed leap seconds).

Other proposals aim to extend the clock_gettime interface instead of replacing the default clock. One is CLOCK_UTC, which encodes the leap second by growing tv_nsec beyond the [0, NSEC_PER_SEC] range, removing the ambiguity of CLOCK_REALTIME. The other is CLOCK_TAI, which simply encodes TAI.

time_t binary representation

ABIs where time_t is 32 bits are unable to represent times beyond January 2038; their timestamps will jump into the early twentieth century instead. This will prove a problem for some embedded systems that are being deployed now. clock_gettime/timespec_get, 64 bit integers, or other fixed-point formats like TAI64 should be used instead.

Use in protocols and serialisation

Unix timestamps are sometimes persisted, for example through serialisation or archive formats. Most filesystems use them for inode metadata. Internet protocols and formats systematically prefer RFC 3339/ISO 8601 datetimes. The SQL timestamp type is a Unix timestamp; when (fixed-offset) timezones are used, naive datetimes are translated to UTC at the storage boundary. TAI64 has been proposed to address the interoperability shortcomings of POSIX timestamps (and of time_t). When the extra compactness of integers isn't required, RFC 3339 UTC datetimes are self-describing and provide better portability, readability and widespread support.

2326 questions
15
votes
3 answers

Mysql: Convert DB from local time to UTC

I need to convert an existing (datetime fields) db from local time ut UTC. The values are stored ad datetimes on a server with time zone CET (+1) (with summertime +2). When selecting data I use UNIX_TIMESTAMP(), which magically compensates for…
Joernsn
  • 2,319
  • 4
  • 25
  • 33
15
votes
9 answers

Convert String To date in PHP

How can I convert this string 05/Feb/2010:14:00:01 to unixtime ?
streetparade
  • 32,000
  • 37
  • 101
  • 123
15
votes
6 answers

How to create human readable time stamp?

In my PHP program, I'm using $_SERVER to log the page's date visited: $dateStamp = $_SERVER['REQUEST_TIME']; The result is that the $dateStamp variable contains a Unix timestamp like: 1385615749 What's the simplest way to convert it into a…
user4951
  • 32,206
  • 53
  • 172
  • 282
15
votes
2 answers

convert date to unixtime php

I have a form which posts date information month, day, yeah, hour, minute, am/pm. How do i encode/decode this to and from unixtime using php?
mrpatg
  • 10,001
  • 42
  • 110
  • 169
15
votes
2 answers

Convert epoch/unix to Datetime

This is question is not a duplicate, this quesitons demonstrates a problem with a method of conversion, not how to perform the conversion. Read the question in full. I have a timestamp which I believe is a unix time stamp, when using the following…
Andy Clark
  • 3,363
  • 7
  • 27
  • 42
15
votes
6 answers

Batch: Timestamp to UNIX Time

For all I know, Batch does not have a command that gives the UNIX time. The closest one I can find is %time%, which only displays the timestamp. Is there a command, or set of commands in Batch with which you can get the UNIX time?
beary605
  • 802
  • 2
  • 9
  • 18
14
votes
4 answers

group by month of unix timestamp field

I'm trying to get my code to output in the following format: january 2012 - 34 february 2012 - 23 where 34 and 23 would be a count of the total rows that fall within that month that have the id_dealership of 7. I need this to output all data for…
scarhand
  • 4,269
  • 23
  • 63
  • 92
14
votes
3 answers

Convert UNIX time (INT) to timestamp in BigQuery

I have a column "date_time" in a BigQuery table which contains unix timestamp values like "1569888224". The problem is that these values are integer data types, not timestamp data types, so I do not seem to have an easy way to convert them to human…
14
votes
6 answers

Will `gmtime()` report seconds as 60 when in a leap second?

I have a server running in TZ=UTC and I have code like this: time_t t = time(NULL); struct tm tm; gmtime_r(&t, &tm); The question is will tm.tm_sec == 60 when the server is within a leap second? For example, if I were in the following time…
Yuki
  • 3,857
  • 5
  • 25
  • 43
14
votes
2 answers

Convert unix epoch timestamp to TSQL datetime

I have found only one similar question but for MySQL. I was working on a web service and had to query the database (MS SQL server). Since I couldn't get the right result I decided to test the query via a SQL client. The web service uses Hibernate…
linski
  • 5,046
  • 3
  • 22
  • 35
14
votes
2 answers

How to generate a UTC Unix Timestamp in C#

Possible Duplicate: How to convert UNIX timestamp to DateTime and vice versa? How can I create a unix timestamp in C#? (e.g. 2012-10-10 14:00:00 -> 1349877600)
LostPhysx
  • 3,573
  • 8
  • 43
  • 73
13
votes
2 answers

Golang: How to Convert time.Time to a Protobuf Timestamp?

I have a time.Time variable in Golang 10-30 00:49:07.1236 that needs to be converted to a Go Protobuf timestamp.Timestamp. Any idea on what functions can be used to accomplish this? Or am I looking at this from the wrong angle?
FestiveHydra235
  • 473
  • 1
  • 7
  • 23
13
votes
4 answers

Why does DateTime to Unix time use a double instead of an integer?

I'm needing to convert a DateTime to a Unix timestamp. So I googled it looking for some example code In just about all the results I see, they use double as the return for such a function, even when explicitly using floor to convert it to an…
Earlz
  • 62,085
  • 98
  • 303
  • 499
13
votes
2 answers

DATETIME VS INT for storing time?

Which one is best to use, DateTime or INT (Unix Timestamp) or anything else to store the time value? I think INT will be better at performance and also more universal, since it can be easily converted to many timezones. (my web visitors from all…
Terry Djony
  • 1,975
  • 4
  • 23
  • 41
13
votes
2 answers

Getting file modification time on UNIX using utime in C

I have been told by a professor that you can get a file's last modification time by using utime.h. However, the man page seem to cite that utime() only sets this value. How can I look up the last time a file was changed in C on a UNIX system?
XBigTK13X
  • 2,655
  • 8
  • 30
  • 39