【发布时间】:2011-02-10 00:20:35
【问题描述】:
我有一个问题,我需要处理月份和日期部分是可选的日期。例如,总是可以知道年份,但有时不知道日期或月份和日期。
在 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 中使用?
最后,这是最好的方法吗?还是有“最佳实践”方法?
编辑:
这是我目前正在做的事情:
日期字段可以接受格式为 YYYY、YYYY-MM 或 YYYY-MM-DD 的日期,并在发送到数据库之前在此函数中处理:
/**
* 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。
我的数据库最终得到了一个有效的日期格式,当它返回时我有办法再次使用它。
有人想出更好的方法吗?
【问题讨论】:
-
您对样品的预期结果是什么?
-
如果 MySQL 样本的格式为 YYYY-MM-DD,无论它们是否有 00,它们都可以工作。 PHP 示例在评论中返回结果,但我希望它在第一个中格式化 2011-00-00,在第二个中格式化 2011-02-00。