Вопрос

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

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

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

Это было полезно?

Решение

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


До этого вам приходилось разрабатывать специальную функцию для анализа используемого формата;с PHP < 5.3 обычно делается следующее:

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

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


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

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

Другие советы

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

$date = new Zend_Date($string, $format);
$timestamp = $date->get();

Вы можете использовать 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);
}

Для версии PHP до 5.3 я использую эту функцию ниже, чтобы получить ДатаВремя Строки формы объекта, отформатированные как '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 и верните его.

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

$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top