Intereting Posts

PHP – использование даты, чтобы узнать о летнее время

Я хочу дать дату () дату и вернуть ее, если эта дата является 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.

Related of "PHP – использование даты, чтобы узнать о летнее время"

Вы не можете использовать 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');

0

Есть два часа 1:00, а 2:01 – второй час плюс 1 час и 1 минута.