В моем веб-приложении у меня есть пользователь, вводящий дату в простом текстовом поле. Этот ввод (после дезинфекции, конечно) выполняется через strtotime (), и к нему добавляется 86399, чтобы сделать эту метку в конце дня (11:59:59). Это предназначено для срочных целей (поэтому, если дата проходит, приложение поднимает флаг)
В те дни, когда я тестировал, он работал …
5 января сохранено 5 января, в конце дня.
13 марта сэкономлено 13 марта
15 марта сэкономлено 15 марта
14 марта, по какой-то причине, спасла себя как 15 марта.
14 марта загадочно пару секунд коротки или что-то?
Обновление: благодаря oezi для решения – работал как шарм. Код в соответствии с запросом:
Старый код:
if ($_POST['dateto'] != '') { $dateto = strtotime(mysql_real_escape_string($_POST['dateto'])) + 86399; }
Новый код:
# Offset to "end of day" list($y,$m,$d) = explode('-',date("Ymd",strtotime($_POST['dateto']))); $d++; $dateto = strtotime($y . '-' . $m . '-' . $d) - 1;
Как говорили другие, это связано с летним временем. Чтобы решить эту проблему, вы можете сделать следующее:
<?php list($y,$m,$d) = explode('-',date("Ymd",strtotime($date_from_user))); $h = 23; $i = 59; $s = 59; $mytimestamp = "$y-$m-$d $h:$i:$s"; ?>
14 марта 2010 года – это день перехода на летнее время в США. Поэтому, если вы делаете математику в местном часовом поясе, 14 марта всего 23 часа.
Я бы предположил, потому что это начало летнего времени
Какую базу данных вы используете? должен быть лучший способ сделать это (большинство команд управления датой являются специфичными для базы данных). В SQL Server я просто добавляю 1 день к дате, а затем вычитаю 1 секунду:
DECLARE @YourDate datetime SET @YourDate='2010-03-14' SELECT DATEADD(ss,-1,@YourDate+1)
ВЫВОД:
----------------------- 2010-03-14 23:59:59.000 (1 row(s) affected)
для чего это стоит, я бы предпочел бы иметь условие: < NextDay
than <=CurrentDay12_59_59
Во всех часовых поясах, которые «поддерживают» летнее время , вы получите два дня в году, которые не имеют 24 часа. У них будет 25 или 23 часа соответственно. И даже не думайте о жестком кодировании этих дат. Они меняются каждый год, а также между часовыми поясами.
О, и вот список из 34 других причин, о которых вы не думали, и почему вы не должны делать то, что делаете .
http://tycho.usno.navy.mil/leapsec.html
Не все дни составляют 86400 секунд.
Это редкое событие. И (исторически) никогда не планировалось в марте.