Я хочу дать дату () дату и вернуть ее, если эта дата является DST или нет. Запуск PHP 5.4.7 через xampp в окне Windows 7. Ядро Linux, работающее с PHP 5.2.8, возвращает 0 независимо от того, какую дату я ему даю.
Что случилось с моим кодом?
echo date('I', strtotime('30-Mar-2013')); # should return a 1 but returns 0 echo date('I', strtotime('30-Mar-2013 America/Los_Angeles'))."<br>"; # returns 0 echo date('I', strtotime('31-Mar-2013 America/Los_Angeles'))."<br>"; # returns 1
Переключение между DST должно быть между 9 марта 2013 года – 10 марта 2013 года.
На этом этапе возникает вопрос: почему мой PHP-код не возвращает 1.
Вы не можете использовать strtotime
потому что он создает strtotime
метку UTC, которая удаляет информацию о часовом поясе. Вместо этого просто используйте 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
Обратите внимание, что DST по-прежнему 0 на этом последнем? Это потому, что переход происходит в 2:00 утра:
$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
Это переход «с пружинным движением», где часы перескакивают с 2:00 до 3:00.
Остерегайтесь двусмысленности во время переходов, когда часы перескакивают с 2:00 до 1:00
$date = new DateTime('3-Nov-2013 01:00 America/Los_Angeles'); echo $date->format('I'); # 1
Есть два часа 1:00, и это занимает первое. Это неоднозначно, потому что мы, возможно, имели в виду второй, и это не представлено.
Можно было бы подумать, что PHP позволит одно из следующих:
new DateTime('3-Nov-2013 01:00 -0700 America/Los_Angeles') #PDT new DateTime('3-Nov-2013 01:00 -0800 America/Los_Angeles') #PST
Но они не работают, когда я тестировал. Я также пробовал даты формата ISO. Кто-нибудь знает, как правильно различать двусмысленные значения в PHP? Если да, отредактируйте или обновите комментарии. Благодарю.
Остерегайтесь двусмысленности во время переходов, когда часы перескакивают с 2:00 до 1:00 $date = new DateTime('3-Nov-2013 02:01 America/Los_Angeles');
echo $date->format('I');
Есть два часа 1:00, а 2:01 – второй час плюс 1 час и 1 минута.