You can't use strtotime
because it creates a UTC timestamp, which removes the timezone information. Instead, just use DateTime
$date = new DateTime('30-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1
$date = new DateTime('31-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1
$date = new DateTime('09-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0
$date = new DateTime('10-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0
Notice that the DST is still 0 on that last one? That's because the transition happens at 2:00 AM:
$date = new DateTime('10-Mar-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 0
$date = new DateTime('10-Mar-2013 02:00 America/Los_Angeles');
echo $date->format('I');
# 1
This is a "spring-forward" transition, where the clock jumps from 2:00 to 3:00.
Beware of ambiguity during fall-back transitions, where the clock jumps from 2:00 back to 1:00
$date = new DateTime('3-Nov-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 1
There are two 1:00 AMs, and this is taking the first one. It is ambiguous, because we might have meant the second one, and that is not represented.
One would think that PHP would allow either of the following:
new DateTime('3-Nov-2013 01:00 -0700 America/Los_Angeles') #PDT
new DateTime('3-Nov-2013 01:00 -0800 America/Los_Angeles') #PST
But these don't seem to work when I tested. I also tried ISO format dates. Anyone know how to properly distinguish ambiguous values in PHP? If so, please edit or update in comments. Thanks.
1
here. Are you using PHP5? – Stephastrtotime()
doesn't change server's timezone settings and resulted timestamp doesn't store any TZ information. – Heidiheidie