DateTime :: createFromFormat в PHP <5.3.0 - PullRequest
3 голосов
/ 22 февраля 2010

Я ищу функцию, идентичную DateTime :: createFromFormat , но мне нужно, чтобы она работала в среде с версией PHP, более старой, чем v5.3. По сути, мне нужно предоставить формат, как если бы вы использовали функцию Date () , а затем мне нужно проанализировать / проверить строку по этому формату и вернуть метку времени, если строка отформатирована правильно и действительная дата.

Кто-нибудь знает, где я могу найти что-то подобное, или я должен сам написать это?

Опять же, это должно работать с определенным форматом, представленным в качестве аргумента. Формат может быть любым, поэтому нет гарантии, что я могу просто использовать strtotime () .

Ответы [ 5 ]

6 голосов
/ 22 февраля 2010

DateTime::createFromFormat и date_parse_from_format были добавлены в PHP 5.3, потому что был высокий спрос на эту функцию, особенно со стороны разработчиков, которые пишут для пользователей, которые не используют Форматы даты и времени в США.


Перед этим вам нужно было разработать специальную функцию для анализа используемого вами формата; с PHP <5.3 обычно делается: </p>

  • Решите, какой формат будет принят приложением
  • Вывести на экран какое-нибудь сообщение, наподобие «Ваш ввод должен быть в формате JJ / MM / AAAA» (французский для ДД / ММ / ГГГГ)
  • Проверьте, что вход в порядке, относительно этого формата
  • И проанализируйте его, чтобы преобразовать в дату / время, понятное PHP.

Это означает, что приложения и разработчики, как правило, не допускают такого количества форматов, поскольку каждый формат подразумевает одну отдельную дополнительную проверку / функцию анализа.


Если вам действительно нужна такая функция, которая учитывает любой возможный формат, я боюсь, что вам придется написать ее самостоятельно: - (

Может быть, взглянуть на источники date_parse_from_format может помочь, если вы понимаете код C? Он должен выглядеть примерно так: ext/date/php_date.c - но не все так просто: он вызывает функцию timelib_parse_from_format, которая определена в ext/data/lib/parse_date.c, и выглядит не очень дружелюбно ^^

4 голосов
/ 12 сентября 2010

Вы можете использовать класс Zend_Date из Zend Framework: http://framework.zend.com/manual/en/zend.date.html

$date = new Zend_Date($string, $format);
$timestamp = $date->get();
3 голосов
/ 10 января 2012

Вы можете использовать strptime() - он использует формат strftime(). Немного отличается от формата date(), но делает почти то же самое.

function createFromFormat($strptimeFormat, $date) {
    $date = strptime($date, $strptimeFormat);
    $date['tm_year'] += 1900;
    $date['tm_mon']++;
    $timestamp = mktime($date['tm_hour'], $date['tm_min'], $date['tm_sec'], $date['tm_mon'], $date['tm_mday'], $date['tm_year']);
    return new DateTime('@'. $timestamp);
}
1 голос
/ 10 августа 2012

Для версии PHP до 5.3 я использую эту функцию ниже для получения DateTime строк формы объекта, отформатированных как 'DD.MM.YYYY'.

function ParseForDateTimeValue ($strText)
{
    if ($strText != "")
    {
        if (ereg("^([0-9]{1,2})[/\.]\s*([0-9]{1,2})[/\.]\s*([0-9]{2,4})$",$strText,$arr_parts)) {

            $month = ltrim($arr_parts[2], '0');
            $day = ltrim($arr_parts[1], '0');
            $year = $arr_parts[3];

            if (checkdate($month, $day, $year)) {
               return new DateTime(date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
            }
        }
    }
    return NULL;
}
  • Сначала проверьте правильность ввода.
  • Затем извлеките месяц, день и год
  • Используйте checkdate для проверки даты.
  • Преобразовать его в метку времени, передать его в конструктор DateTime и вернуть его.
0 голосов
/ 22 февраля 2010

Вы можете создать timestamp, а затем запустить его до даты .., чтобы создать timestamp, вы можете сделать explode для строки, которую вы получите.

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...