To GMT or not to GMT
A leap day with a post on Date/Time issues seems fitting...
Earlier today, on twitter, @skoop asked: "dear #lazyweb, when I use DateTimeZone('GMT'), why does format('e') output UTC?" What he means is that:
$date = new DateTime('now', new DateTimeZone('GMT'));
echo $date->format(DateTime::RFC2822 . ' e' );
which shows:
Wed, 29 Feb 2012 16:26:23 +0000 UTC
As you can see that has UTC and not GMT as you might expect.
If you look closely at the documentation for the "Other" group of timezones, it lists with the GMT timezone as warning: "Please do not use any of the timezones listed here (besides UTC), they only exist for backward compatible reasons." If you use GMT as timezone identifier in the constructor to DateTimeZone, PHP will instead use the correct UTC in output. When you create a DateTimeZone object like this, you will always get a "type 3" DateTimeZone object:
$date = new DateTime('now', new DateTimeZone('GMT'));
var_dump($date);
which shows:
object(DateTime)#1 (3) {
["date"]=>
string(19) "2012-02-29 16:30:51"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
Now apparently some systems *cough*Silverlight*cough* require GMT to be used. GMT is not a timezone, but just a timezone abbreviation meant for output only. Read more about that in the article "Leap Seconds and What To Do With Them". However, if it is necessary you can create a DateTime object with a different timezone type. In this case you want a "type 2" timezone associated with the DateTime object. You do that by simply forcing that timezone abbreviation when instantiating a DateTime object:
$date = new DateTime('today GMT');
var_dump( $date );
which shows:
object(DateTime)#1 (3) {
["date"]=>
string(19) "2012-02-29 16:32:16"
["timezone_type"]=>
int(2)
["timezone"]=>
string(3) "GMT"
}
Things like this also work:
$date = new DateTime( "GMT" ); $date->setDate( 2012, 2, 19 ); var_dump( $date );
And of course, this is not limited to GMT only:
$date = new DateTime( "EST" ); $date->setDate( 2012, 2, 19 ); var_dump( $date );
which shows:
object(DateTime)#1 (3) {
["date"]=>
string(19) "2012-02-19 16:37:58"
["timezone_type"]=>
int(2)
["timezone"]=>
string(3) "EST"
}
As a reminder of the three different types of timezones that can be attached to DateTime objects:
-
A UTC offset, such as in
new DateTime( "2012-02-29 -0500" ); -
A timezone abbreviation, such as in
new DateTime( "2012-02-29 EST" ); -
A timezone identifier, such as in
new DateTime( "2012-02-29 America/Montreal" );
Please also be aware that only DateTime objects with "type 3" timezones attached to them will calculate correctly over Daylight Saving Time boundaries.
If you want to learn more about Dates and Times, and how to use them with PHP, please get a copy of my book "php|architect's Guide to Date and Time Programming".
Comments
Varnish seems to be picky about the format of the If-Modified-Since/Last-Modified request/response headers if it is to support 304 Not Modified.
On some projects I have had to create a GMT timestamp by doing something like this to make Varnish respond with a 304:
$date = new DateTime('@' . $someUnixTimestamp);
header('Last-Modified: ' . $date->format('D, d M Y H:i:s') . ' GMT');
An example of the formatted timestamp:
Mon, 27 Feb 2012 12:31:48 GMT
Where's the +1 button ?
Thanks Derick for this !
Life Line
Little Owl owlet
This lovely owlet was quite easy to find in a London Park, with some help as they camouflage so well!
I saw its sibling too.
#BirdPhotography #BirdsOfFediverse #Photography #Nature #London #BirdsOfMastodon
I went to a park (Bushy Park) to look for some owls.
I found Owls (Little and Tawny), but also a Green Woodpecker and two Kingfishers.
Snaps from my camera screen, and real photos will follow, but not of the Kingfishers as they were too far away and the photos are blurry.
#london #BirdPhotogaphy #BirdsOfMastodon #Birds #photography #BirdsOfFediverse #BushyPark
I hiked 13.8km in 4h44m12s
Created a chocolate shop and a restaurant; Updated 6 restaurants and an address; Confirmed 5 restaurants, a community_centre, and 3 other objects
Created a restaurant, a fast_food, and 2 other objects; Deleted a restaurant
I walked 8.5km in 1h31m45s
Created 2 buildings and a hairdresser shop; Updated a restaurant and an estate_agent office; Confirmed a cafe
I walked 2.2km in 38m09s
Merged pull request #1096
Bump actions/checkout from 6 to 7
Merged pull request #1095
Improve Tiverton Green mapping
Created 2 gates
I walked 7.1km in 1h23m15s
I walked 1.0km in 9m24s
Realign streets. They now have much less wide corners into each other.
Updated a fast_food
I walked 9.1km in 1h35m41s
I hiked 4.7km in 3h24m10s
I walked 6.7km in 1h12m03s
I walked 7.7km in 1h47m24s
Updated a pub
Updated a pub
Created a bar; Updated a bar; Confirmed a restaurant and a bar




Shortlink
This article has a short URL available: https://drck.me/gmt-9bx