У меня проблема с обработкой дат, когда части месяца и дня являются необязательными.Например, год всегда будет известен, но иногда день или месяц и день будут неизвестны.
В 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.
Я получаю правильный формат даты для своей базы данных, и у меня есть способ использовать его снова, когда он выйдет.
Кто-нибудь придумает лучший способсделать это?