Как заставить strtotime () возвращать дату вместо времени, если задано неоднозначное $ time? - PullRequest
1 голос
/ 06 февраля 2012

Хорошего вечера!

echo date('r', strtotime('10.01.11'));

Отпечатки: Вс, 05 февраля 2012 10: 01: 11

Ожидается: Пн, 10 января 2011 00: 00: 00

Как заставить strtotime() анализировать входную строку только как дату? Я должен конвертировать кучу дат в другом формате. DateTime::format не вариант, так как я не знаю всех форматов, в которых будет работать скрипт, и он даже не установлен на сервере (и у меня нет привилегий для этого).

Пытались
strtotime('day 10.01.11')
strtotime('10.01.11 00:00:00')
strtotime('10.01.11 midnight')
- ничего не сработало.

Любая помощь очень ценится

Ответы [ 5 ]

2 голосов
/ 06 февраля 2012

Как заставить strtotime () анализировать входную строку только как дату?

Вы не делаете. strtotime использует очень четко определенные форматы синтаксического анализа . То, что оно генерирует, будет полностью зависеть от того, что вы ему дадите.

'10.01.11' анализируется как формат времени , поскольку всегда интерпретирует три пары цифр, разделенных точками, как время. Он будет распознавать даты , если они разделены тире, косой чертой или пробелом . Досадно, что на странице формата даты есть пример, в котором используются точки, но, похоже, нет верного пути к принудительному разбору даты вместо разбора времени. Вздох, PHP.

Если вам нужно, чтобы этот конкретный формат интерпретировался как дата, а не как время, у вас есть два варианта.

Во-первых, вы можете использовать другой метод анализа даты. Если ожидаемый формат никогда не менялся, вы можете использовать DateTime::createFromFormat() или ужасающий strptime. В комментариях вы указали, что формат будет различным, и ваша версия PHP достаточно старая, чтобы не иметь DateTime, поэтому это может не сработать.

Во-вторых, вы можете предварительно обработать данные. По крайней мере, в этом примере преобразование . в / может помочь, хотя 10/01/11 может быть неоднозначным как дата для людей. Нет ничего плохого в том, чтобы немного понюхать регулярное выражение, чтобы определить, как лучше всего обрабатывать данные.

Существует также третий вариант: если вы получаете эту информацию от пользователей, заставьте ваше приложение начать заставлять пользователей вводить даты в обычном, согласованном, разбираемом формате. Обучение ваших пользователей использованию YYYY-MM-DD может занять некоторое время, но, вероятно, это самая разумная долгосрочная ставка.

1 голос
/ 06 февраля 2012

Является ли модификация ввода опцией для вас?

$str = '10.01.11';
$str = str_replace('.', '/', $str);

echo date('r', strtotime($str));

Однако при этом все равно будет выводиться Sat, 01 Oct 2011 00:00:00, в соответствии с шаблоном MM.DD.YY (стандарт США).


РЕДАКТИРОВАТЬ: В зависимости от вашего использования, вы можете рассмотреть возможность создания списка шаблонов регулярных выражений и соответственно проанализировать дату.Очень трудно сделать подобный код открытым для всех возможностей.

1 голос
/ 06 февраля 2012

почему бы вам не добавить время, установленное на 00:00:00 по умолчанию?Например,

echo date('D, d M Y H:i:s', strtotime('10.01.11'));

также strtotime использует американский формат даты, поэтому он будет переведен на 1 октября 2011 года. Использовать формат даты iso

проще
1 голос
/ 06 февраля 2012

Проверено, это работает:

$date = DateTime::createFromFormat('d.m.y', '10.01.11');
echo $date->format('r');

http://codepad.viper -7.com / OH7Kyn

0 голосов
/ 06 февраля 2012

Я не думаю, что strtotime знает, как анализировать эти даты. Чтобы избежать двусмысленности, лучше всего использовать даты ISO 8601 (ГГГГ-ММ-ДД).

...