#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); работает лучше всего.