Функции php date (), выдающие неожиданный вывод - PullRequest
1 голос
/ 11 марта 2011

Я пытаюсь выполнить некоторые базовые операции с датой и меткой времени в PHP и получаю неожиданные результаты. Я пытаюсь получить временную метку с указанием только года, месяца и дня месяца (т. Е. Временную метку даты в 12:00 утра) существующей временной метки $startDate. Однако она также меняла дату, как видно из следующего кода.

$startDateString = date("Y-M-j", $startDate);
$startDateTimestamp = strtotime($startDateString);
echo "$startDate == $startDateTimestamp ?<br>";
echo date("Y-M-j", $startDate)." == ".date("Y-M-j", $startDateTimestamp)." ?<br>";

Это дает мне следующий вывод:

1299299589 == 1298952000 ?
2011-Mar-4 == 2011-Feb-28 ?

Хотя я не ожидаю, что временные метки будут одинаковыми (так как $startDate не обязательно в 12:00 утра), я не вижу, как календарные даты не совпадают. Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 11 марта 2011

Из документации strtotime :

Строка даты / времени. Допустимые форматы объясняются в форматах даты и времени .

Что касается проблемы, которую вы пытаетесь решить, вы можете передать в strtotime другие вещи, например относительные форматы .

strtotime('midnight', $startDate);

Например, чтобы отобразить полночь (вы также можете использовать сегодня, если полночь сбивает с толку) текущего времени:

echo date('Y-m-d H:i:s', strtotime('midnight'));

И сегодня, и в полночь. 1019

Время установлено на 00: 00: 00

Конечно, я большой поклонник объекта DateTime .

$date = new DateTime($startDate);
$date->modify('midnight');
echo $date->format('Y-m-d H:i:s');
1 голос
/ 11 марта 2011

После нескольких коротких тестов я заметил, что strtotime() не может правильно проанализировать формат Y-M-j. Чтобы это исправить, используйте стандартный формат, такой как формат даты и времени RFC822 , формат даты и времени ISO-8601 или используйте j-M-Y вместо.

1 голос
/ 11 марта 2011

Я обычно использую формат "Y-m-d" для подобных задач, и это работает:

$startDateString = date("Y-m-d", $startDate);
$startDateTimestamp = strtotime($startDateString);
echo "$startDate == $startDateTimestamp ?<br>";
echo date("Y-m-d", $startDate)." == ".date("Y-m-d", $startDateTimestamp)." ?<br>";
...