Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does PHP time() return a GMT/UTC Timestamp?

Tags:

php

I just want to check if time() returns a UTC/GMT timestamp or do I need to use date_default_timezone_set()?

like image 314
Jiew Meng Avatar asked Jan 27 '11 02:01

Jiew Meng


People also ask

What does time () in PHP return?

The time() function returns the current time in the number of seconds since the Unix Epoch (January 1 1970 00:00:00 GMT).

Is PHP time always UTC?

The function time() returns always timestamp that is timezone independent (=UTC). date_default_timezone_set("UTC"); echo "UTC:".

How can I get GMT in PHP?

PHP | gmdate() Function The gmdate() is an inbuilt function in PHP which is used to format a GMT/UTC date and time and return the formatted date strings. It is similar to the date() function but it returns the time in Greenwich Mean Time (GMT).

How do I get GMT timestamp?

Use the getTime() method to get a GMT timestamp, e.g. new Date(). getTime() . The method returns the number of milliseconds since the Unix Epoch and always uses UTC for time representation. UTC shares the same current time with GMT.


2 Answers

time returns a UNIX timestamp, which is timezone independent. Since a UNIX timestamp denotes the seconds since 1970 UTC you could say it's UTC, but it really has no timezone.


To be really clear, a UNIX timestamp is the same value all over the world at any given time. At the time of writing it's 1296096875 in Tokyo, London and New York. To convert this into a "human readable" time, you need to specify which timezone you want to display it in. 1296096875 in Tokyo is 2011-01-27 11:54:35, in London it's 2011-01-27 02:54:35 and in New York it's 2011-01-26 21:54:35.

In effect you're usually dealing with (a mix of) these concepts when handling times:

  • absolute points in time, which I like to refer to as points in human history
  • local time, which I like to refer to as wall clock time
  • complete timestamps in any format which express an absolute point in human history
  • incomplete local wall clock time

Visualise time like this:

-------+-------------------+-------+--------+----------------+------>        |                   |       |        |                | Dinosaurs died        Jesus born  Y2K  Mars colonised       ??? 

(not to scale)

An absolute point on this line can be expressed as:

  • 1296096875
  • Jan. 27 2011 02:54:35 Europe/London

Both formats express the same absolute point in time in different notations. The former is a simple counter which started roughly here:

                          start of UNIX epoch                                   | -------+-------------------+------++--------+----------------+------>        |                   |       |        |                | Dinosaurs died        Jesus born  Y2K  Mars colonised       ??? 

The latter is a much more complicated but equally valid and expressive counter which started roughly here:

              start of Gregorian calendar                            | -------+-------------------+-------+--------+----------------+------>        |                   |       |        |                | Dinosaurs died        Jesus born  Y2K  Mars colonised       ??? 

UNIX timestamps are simple. They're a counter which started at one specific point in time and which keeps increasing by 1 every second (for the official definition of what a second is). Imagine someone in London started a stopwatch at midnight Jan 1st 1970, which is still running. That's more or less what a UNIX timestamp is. Everybody uses the same value of that one stopwatch.

Human readable wall clock time is more complicated, and it's even more complicated by the fact that it's abbreviated and parts of it omitted in daily use. 02:54:35 means almost nothing on the timeline pictured above. Jan. 27 2011 02:54:35 is already a lot more specific, but could still mean a variety of different points on this line. "When the clock struck 02:54:35 on Jan. 27 2011 in London, Europe" is now finally an unambiguous absolute point on this line, because there's only one point in time at which this was true.

So, timezones are a "modifier" of "wall clock times" which are necessary to express a unique, absolute point in time using a calendar and hour/minute/second notation. Without a timezone a timestamp in such a format is ambiguous, because the clock struck 02:54:35 on Jan. 27 2011 in every country around the globe at different times.

A UNIX timestamp inherently does not have this problem.


To convert from a UNIX timestamp to a human readable wall clock time, you need to specify which timezone you'd like the time displayed in. To convert from wall clock time to a UNIX timestamp, you need to know which timezone that wall clock time is supposed to be in. You either have to include the timezone every single time with each such conversion, or you set the default timezone to be used with date_default_timezone_set.

like image 134
deceze Avatar answered Sep 19 '22 03:09

deceze


Since PHP 5.1.0 (when the date/time functions were rewritten), every call to a date/time function will generate a E_NOTICE if the timezone isn't valid, and/or a E_WARNING message if using the system settings or the TZ environment variable.

So in order to get a UTC timestamp you should check what the current timezone is and work off of that or just use:

$utc_str = gmdate("M d Y H:i:s", time()); $utc = strtotime($utc_str); 
like image 37
Julian Avatar answered Sep 19 '22 03:09

Julian