странное поведение в php date

#php #date

#php #Дата

Вопрос:

Простой код для печати даты

 $first_date = 1319493600;
$last_date = 1320184800;

$testDate = $first_date;


while ($testDate<=$last_date)
{
    echo strftime("%a", $testDate).' '. strftime("%d", $testDate).' '.strftime("%b", $testDate).'<br>';
    $testDate  = 86400;
}
  

Да, этот простой скрипт подводит меня, как вы видите ниже

 Tue 25 Oct
Wed 26 Oct
Thu 27 Oct
Fri 28 Oct
Sat 29 Oct
Sun 30 Oct <----Error
Sun 30 Oct <----Error
Mon 31 Oct
Tue 01 Nov
  

У кого-нибудь есть идеи, почему?

Комментарии:

1. Это действительно интересно. Возможно, вы пробовали, $TestDate = strtotime(‘ 1 день’, $TestDate); ?

2. Кроме того, использование date(«D d M», $TestDate) вместо strftime выводит тот же текст?

3. Этот код работает нормально для меня, интересно…

4. @dev: вы на правильном пути .. 🙂

5. @Shai Mishali Ваш подход верен. 1 день работает лучше. Как уже говорили здесь другие, никогда не увеличивайте день на 24 часа. спасибо всем вам, ребята — это был полезный урок для меня.

Ответ №1:

Это, по сути, причина, по которой вы никогда не должны увеличивать день, добавляя 24 часа к отметке времени. Скорее всего, вы находитесь в часовом поясе, в котором соблюдается летнее время, а последнее воскресенье октября длится не 24 часа.

Вы можете подтвердить это, добавив echo strftime("%r %x", $testDate); внутри цикла. (Также обратите внимание, что вы можете использовать несколько модификаторов, strftime() поэтому вам не нужно их объединять: strftime("%a %d %b", $testDate); .)

Всегда используйте функции даты, такие как strtotime() или mktime() , для увеличения даты.

Комментарии:

1. вы правы. $TestDate = strtotime(‘ 1 день’, $TestDate); работает лучше всего.

Ответ №2:

Похоже, это связано с DST .. часы меняются в последнее воскресенье октября, в этом году Солнце 30 октября.

Примечание: вы также должны находиться в «правильном» часовом поясе, чтобы это произошло, например, здесь это:

  # date -ud@1319493600
 Mon Oct 24 22:00:00 UTC 2011
  

так что один час не имеет никакого значения, но для вас это имеет значение. Это может быть довольно раздражающим, поскольку люди не смогут воспроизвести вашу проблему 🙂

Комментарии:

1. Это проблема летнего времени. Я в Греции — мы меняем наше время на вс 30 октября.

Ответ №3:

Вероятно, это связано с переходом на летнее время 30 октября. Попробуйте запустить скрипт с распечатанным временем, чтобы увидеть изменения. Вот пример в моем часовом поясе:

 php > $first_date = 1319493600;
php > $last_date = 1320184800;
php >
php > $testDate = $first_date;
php >
php >
php > while ($testDate<=$last_date)
php > {
php {     echo strftime("%a", $testDate).' '. strftime("%d", $testDate).' '.strftime("%b", $testDate). '(' . strftime("%d.%m.%Y %H:%M:%S", $testDate) . ")n";
php {     $testDate  = 86400;
php { }
Mon 24 Oct(24.10.2011 23:00:00)
Tue 25 Oct(25.10.2011 23:00:00)
Wed 26 Oct(26.10.2011 23:00:00)
Thu 27 Oct(27.10.2011 23:00:00)
Fri 28 Oct(28.10.2011 23:00:00)
Sat 29 Oct(29.10.2011 23:00:00)
Sun 30 Oct(30.10.2011 22:00:00)
Mon 31 Oct(31.10.2011 22:00:00)
Tue 01 Nov(01.11.2011 22:00:00)
  

Ответ №4:

На моей машине вывод:

 root@ubuntu:~# php /tmp/tst.php
Mon 24 Oct
Tue 25 Oct
Wed 26 Oct
Thu 27 Oct
Fri 28 Oct
Sat 29 Oct
Sun 30 Oct
Mon 31 Oct
Tue 01 Nov
root@ubuntu:~# php -v
PHP 5.3.5-1ubuntu7.2 with Suhosin-Patch (cli) (built: May  2 2011 23:18:30)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
  

какую PHP версию вы используете?

Кроме того, это может иметь какое-то отношение к переходу на летнее время — попробуйте также распечатать часы

Комментарии:

1. XAMPP 1.7.4 [PHP: 5.3.5] Моя ошибка, как кажется, заключалась в $TestDate = 86400; часть кода. $TestDate = strtotime(‘ 1 день’, $TestDate); работает лучше всего.