Затем, вставив их в соответствующие поля в следующем бите PHP, вы получите результат, который вы ищете.

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

В MySQL я могу создать таблицу с полем даты, и, хотя я не могу найти какую-либо ссылку в руководстве MySQL, она примет следующее как допустимое:

(YYYY-MM-DD format):
2011-02-10    // Current date
2011-02-00    // Day unknown so replaced with 00
2011-00-00    // Day and month unkown so replaced with 00-00

Тестовые расчеты из базы данных работают нормально, поэтому я все еще могу легко сортировать результаты. В руководстве говорится, что месяц должен быть между 01 и 12, а день между 01 и 31 - но он принимает 00.

Первый вопрос: у меня возникнут проблемы с использованием 00 в частях месяца или дня, или это вполне приемлемо?

Следующий вопрос: существует ли функция PHP (или команда форматирования MySQL), которая автоматически форматирует следующие даты в требуемую строку формата?

2011      becomes   2011-00-00
2011-02   becomes   2011-02-00

Или мне нужно написать специальную функцию, чтобы справиться с этим?

Следующее не работает:

<?php
$date = date_create_from_format('Y-m-d', '2011-00-00');
echo date_format($date, 'Y-m-d');
// Returns 2010-11-30

$date = date_create_from_format('Y-m-d', '2011-02-00');
echo date_format($date, 'Y-m-d');
// Returns 2011-01-31 
?>

Третий вопрос: есть ли функция PHP (или команда MySQL) для форматирования дат для использования в PHP?

Наконец, это лучший подход? Или есть метод «лучшей практики»?

РЕДАКТИРОВАТЬ:

Вот что я сейчас делаю:

Поле даты может принимать дату в формате ГГГГ, ГГГГ-ММ или ГГГГ-ММ-ДД, и перед отправкой в ​​базу данных она обрабатывается в этой функции:

/**
* Takes a date string in the form:
*   YYYY or
*   YYYY-MM or
*   YYYY-MM-DD
* and validates it
* 
* Use date_format($date, $format); to reverse.
* 
* @param string $phpDate Date format [YYYY | YYYY-MM | YYYY-MM-DD]
* 
* @return array 'date' as YYYY-MM-DD, 'format' as ['Y' | 'Y-m' | 'Y-m-d'] or returns false if invalid
*/
function date_php2mysql($phpDate) {
    $dateArr = false;
    // Pattern match
    if (preg_match('%^(?P<year>\d{4})[- _/.]?(?P<month>\d{0,2})[- _/.]?(?P<day>\d{0,2})%im', trim($phpDate), $parts)) {
        if (empty($parts['month'])) {
            // Only year valid
            $date = $parts['year']."-01-01";
            $format = "Y";
        } elseif (empty($parts['day'])) {
            // Year and month valid
            $date = $parts['year']."-".$parts['month']."-01";
            $format = "Y-m";
        } else {
            // Year month and day valid
            $date = $parts['year']."-".$parts['month']."-".$parts['day'];
            $format = "Y-m-d";
        }
        // Double check that it is a valid date
        if (strtotime($date)) {
            // Valid date and format
            $dateArr = array('date' => $date, 'format' => $format);
        }
    } else {
        // Didn't match
        // Maybe it is still a valid date
        if (($timestamp = strtotime($phpDate)) !== false) {
            $dateArr = array('date' => date('Y-m-d', $timestamp), 'format' => "Y-m-d");
        }
    }
    // Return result
    return $dateArr;
}

Таким образом, шаблон соответствует входной $ phpDate, где он должен начинаться с 4 цифр, а затем, необязательно, пар цифр для месяца и дня. Они хранятся в массиве с именем $ parts.

Затем он проверяет, существуют ли месяцы или дни, указывая строку формата и создавая дату.

Наконец, если все проверено, возвращается верная дата, а также строка формата. В противном случае он возвращает FALSE.

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

Кто-нибудь думает о лучшем способе сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос