логин: 
<< предыдущая заметкаследующая заметка >>
28 марта 2010
Пацаны, вы не поверите! Ошибка 28 марта в PHP!

Пишем программу:

<?php

die("<p>297 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*297)
."<br>298 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*298)
."<br>299 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*299)
."<br>300 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*300)
."<br>301 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*301)
."<br>302 день от 2009-06-03: ".date("Y-m-d",strtotime('2009-06-03')+(60*60*24)*302)
);

?>

И шо мы видим?

297 день от 2009-06-03: 2010-03-26
298 день от 2009-06-03: 2010-03-27
299 день от 2009-06-03: 2010-03-29
300 день от 2009-06-03: 2010-03-30
301 день от 2009-06-03: 2010-03-31
302 день от 2009-06-03: 2010-04-01

Где 28 марта? Куда дели?! Доктор, я феномен или это у всех так? ;)

PS: Обнаружилось случайно: забеспокоился, что это я сегодня весь день книгу пишу-пишу, пишу-пишу, а график не обновляется. Оказывается - в мире нет 28 марта 2010 года.

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
Страницы, которые привлекли мое внимание за последние дни, рекомендую:
2017-11-22 В июне 1982
архив ссылок
Оставить комментарий
Видимо, ошибка округления.

Первое, что пришло в голову — вычитать единицу.
Windows Safari Chrome
2
3
Iland (#14561)
Нет там никакого округления, всё проще гораздо.. Кто первый догадается?
Windows Firefox
2
1
zencd (propir)
Это из-за перехода на летнее время. Можно попробовать прибавить (или отнять) несколько часов, чтобы сдвинуться с зыбучей полуночи:

strtotime('2009-06-03')+(60*60*24))*298
v
strtotime('2009-06-03')+(60*60*26))*298

А может есть и более рпавильная практика добычи дня.
Windows Safari Chrome
0
3
Iland (#14561)
Уже тепло, почти горячо. Тем не менее, ошибка есть. Вопрос - в чём именно?
Linux Safari Chrome
0
0
[email protected] (sunchaser.info)
strtodate?
Windows Safari Chrome
0
0
Скорее, date работает с учётом летнего временя, переводя на час вперёд, переходя при этом на следующие сутки. Для себя оно вполне корректно работает с юниксовым временем. Юниксовое время складывается честно, и ему глубоко пофиг на летнее время.

В результате, походу, ошибка именно у Леонида (задавать в качестве параметра strtotime надо не крайнее значение), а не php. За это, кстати, можно особенно любить летнее время - от него много скриптов ломается...
Если дело только в летнем времени, то почему после вычитания одной секунды все начинает работать правильно? :)
Windows Safari Chrome
0
10
А головой подумать не получается? Если нет, могу подсказать хорошую замену - посмотрите документацию по функции date, она позволяет выводить несколько больше, чем дату.
Задиристое поведение a la «молодой петушок» и туманные ссылки на маны вовсе не заменяют ответа на поставленный вопрос :)
Windows Safari Chrome
1
9
Иногда я всё-таки предполагаю, что собеседник способен к самостоятельным мыслительным процессам. В данном случае, похоже, это неправда, потому придётся пояснять.

Попробуйте в приведённом Леонидом примере вместо date('Y-m-d', ...) написать date('Y-m-d H:i:s', ...). Вывод должен помочь даже прожжённому тупым дебагом мозгу. Если и это не поможет, попробуйте число дней задавать циклом от 0 до 300. Если же и это не поможет, попробуйте убиться об стену - оно полезней и для Вас, и для общества.
Ваша логика понятна, спасибо.

Пойду-ка я спать.
Windows Opera
0
0
[email protected] (217888993625)
ошибка в том, что дата начала отсчета задана строкой, а не функцией mktime.
Windows Safari Chrome
0
0
Да, так лучше всего.
Windows
1
0
Alex (#134243)
strtotime('2009-06-03') задаёт точкой отсчета нулевую секунду (время 00:00:00) 3 июня 2009 года. Так как 3 июня действует летнее время, то осенью, во время перехода на зимнее время (в день Д) это время (+ некоторое количество целых дней), вместо того чтобы соответствовать 00:00:00 дня Д+1 начинает соответсвовать 23:00:00 дня Д. Поэтому день Д учитывается дважды - один раз в 00:00:00 и другой раз в 23:00:00.
Весной идет обратный переход на час вперёд в день X. В день X-1 показывается время 23:00:00. Через 24 часа время уже 00:00:00 дня X+1. Таким образом, день X выпадает.
Отсюда можно вычислить день когда переводились стрелки - это 28 марта 2010 года, воскресенье.
Windows Safari Chrome
1
0
28 марта не пропадает, оно заменяется дублирующимся днём, в который часы переводили назад.
Чем дальше в лес... У меня вообще показывает такое:
297 день от 2009-06-03: 2010-03-27
298 день от 2009-06-03: 2010-03-28
299 день от 2009-06-03: 2010-03-29
300 день от 2009-06-03: 2010-03-30
301 день от 2009-06-03: 2010-03-31
302 день от 2009-06-03: 2010-04-01

У всех дат полночь (00:00).
Windows Safari Chrome
0
0
Попробуйте посмотреть/сменить timezone на местный.
http://ru2.php.net/manual-lookup.php?pattern=timezone&la[...]
И то правда. В зоне GMT живу, оказывается :-)
Windows Opera
0
0
[email protected] (217888993625)
http://www.php.su/functions/?date
там про mktime() замечание
Mac Safari
1
0
bukov_net (tonsky)
Таки да, не в каждых сутках 24 часа.
Хех...с этим летним временем вообще какой-то кошмар. По чьей-то прихоти теперь наша область в другом часовом поясе. Телевизор не знает,что показывать (у них вся сетка сбилась), компьютеры по привычке переходят на летнее время - а надо часовой пояс переставлять. И теперь на других электричках уже надо часы переставлять.
Windows Firefox
0
0
dimmik
дык время-то перевели.
Windows Firefox
0
0
zencd (propir)
Так, всё таки, какой способ самый труъ?
Вот в Джаве всё просто:

Date date = new Date('2009-11-18')
date.add(Date.DAY, 301)
Linux Opera
0
0
max (#3036)
Использовать функции для работы с датой (date, mktime, ...) или класс DateTime.
Windows Firefox
0
0
alloginoff
ОФФТОП: слева, в списке блогов, два Вадима Чичерина.
Windows Firefox
0
0
alloginoff
То бишь фича, а не баг. :)
Windows Opera
0
0
anzua
у Шестакова в блоге стоит фотография Каганова с апельсинами
баг? фича?
Mac Safari Chrome
0
0
Как уже говорили — это из-за перехода на летнее время.
Чтобы избежать этого надо просто правильно прибавлять дни, вот так:
strtotime('2009-06-03 +298 days')
Windows Opera
0
0
anzua
lleo, если я ничего не путаю, то ответ на этот комментарий "ОФФТОП: слева, в списке блогов, два Вадима Чичерина." был от тебя и объяснял, что это не баг, а фича, теперь же этот комментарий скрыт
снова баг? снова фича?

всего комментариев: 31

<< предыдущая заметка следующая заметка >>