有没有办法检查日期/时间是否有效你会认为这些很容易检查:
$date = '0000-00-00';
$time = '00:00:00';
$dateTime = $date . ' ' . $time;
if(strtotime($dateTime)) {
// why is this valid?
}
真正让我感到的是:
echo date('Y-m-d', strtotime($date));
结果:“1999-11-30”,
是吗?我去了1999-11-30 ????
我知道我可以进行比较,看看日期是否等于我所拥有的日期,但它不是一个非常强大的检查方式。有没有一个好方法来检查我是否有一个有效的约会?任何人都有很好的功能来检查这个?
编辑: 人们在问我在跑什么: 在Linux localhost 2.6.18-53.1.14.el5#1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU / Linux的
答案 0 :(得分:23)
来自php.net
<?php
function isValidDateTime($dateTime)
{
if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) {
if (checkdate($matches[2], $matches[3], $matches[1])) {
return true;
}
}
return false;
}
?>
答案 1 :(得分:5)
如上所述:https://bugs.php.net/bug.php?id=45647
这里没有错误,00-00-00表示2000-00-00,即1999-12-00, 这是1999-11-30。没有错误,完全正常。
正如一些测试所示,向后滚动是预期的行为,如果有点不安:
>> date('Y-m-d', strtotime('2012-03-00'))
string: '2012-02-29'
>> date('Y-m-d', strtotime('2012-02-00'))
string: '2012-01-31'
>> date('Y-m-d', strtotime('2012-01-00'))
string: '2011-12-31'
>> date('Y-m-d', strtotime('2012-00-00'))
string: '2011-11-30'
答案 2 :(得分:2)
回音日期('Y-m-d',strtotime($ date));
结果:“1999-11-30”
strtotime
的结果是943920000 - 这是大约在Unix epoch(测量时间的基础)到1999-11-30之间的秒数。
在mktime(), localtime(), strtotime()
上有一个记录mysql bug ,当你尝试一个前纪元时间(包括“00:00: 00" )。在链接的线程上有一些关于这是否真的是一个错误的争论:
由于时间戳是从1970年开始的,我认为不应该这样 无论如何都要工作。
下面是一个函数,我用它将上面的dateTimes转换为比较等的时间戳,对于你来说可能有用,对于超过“0000-00-00 00:00:00”的日期< / p>
/**
* Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates
*/
function convert_date_string($date_string)
{
list($date, $time) = explode(" ", $date_string);
list($hours, $minutes, $seconds) = explode(":", $time);
list($year, $month, $day) = explode("-", $date);
return mktime($hours, $minutes, $seconds, $month, $day, $year);
}
答案 3 :(得分:1)
当你超出范围时,不要指望连贯的结果:
cf strtotime
cf Gnu Calendar-date-items。html
“数字月份,ISO 8601 格式'年 - 月 - 日'是允许的, 哪一年是正数, 月是01之间的数字 和12 ,日是一个 数字介于01和31之间。一个 如果a,必须存在前导零 数字少于十。“
所以'0000-00-00'给出了奇怪的结果,这是合乎逻辑的!
“此外,并非全部 平台支持负时间戳, 因此你的日期范围可能是 限于不早于Unix 历元即可。这意味着,例如 %e,%T,%R和%D(可能有 更多)和日期之前的日期 一些,1970年将无法在Windows上运行 Linux发行版,以及其他一些 操作系统。“
cf strftime
使用checkdate功能代替(更强大):
月: 月份介于1到12之间。
日: 这一天是在给定的允许天数内 月。闰年采取 考虑到。
年: 年份介于1到32767之间。
答案 4 :(得分:1)
如果你只是想在没有mysql日期字段的情况下处理日期转换,你可以像我一样修改这个优秀的代码。 在我没有执行此功能的PHP版本上,我每次都会收到“0000-00-00”。烦人。
function ConvertDateString ($DateString)
{
list($year, $month, $day) = explode("-", $DateString);
return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year));
}
答案 5 :(得分:1)
此版本允许该字段为空,日期为mm / dd / yy或mm / dd / yyyy格式,允许单位数小时,添加可选的上午/下午,并纠正时间匹配中的一些细微缺陷
仍允许某些病态时间,如'23:14 AM'。
function isValidDateTime($dateTime) {
if (trim($dateTime) == '') {
return true;
}
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) {
list($all,$mm,$dd,$year) = $matches;
if ($year <= 99) {
$year += 2000;
}
return checkdate($mm, $dd, $year);
}
return false;
}
答案 6 :(得分:0)
我刚刚改变了上面的马丁答案,这将验证任何类型的日期并以您喜欢的格式返回。
只需通过编辑下面的脚本行来更改格式 strftime(“10-10-2012”,strtotime($ dt));
<?php
echo is_date("13/04/10");
function is_date( $str ) {
$flag = strpos($str, '/');
if(intval($flag)<=0){
$stamp = strtotime( $str );
} else {
list($d, $m, $y) = explode('/', $str);
$stamp = strtotime("$d-$m-$y");
}
//var_dump($stamp) ;
if (!is_numeric($stamp)) {
//echo "ho" ;
return "not a date" ;
}
$month = date( 'n', $stamp ); // use n to get date in correct format
$day = date( 'd', $stamp );
$year = date( 'Y', $stamp );
if (checkdate($month, $day, $year)) {
$dt = "$year-$month-$day" ;
return strftime("%d-%b-%Y", strtotime($dt));
//return TRUE;
} else {
return "not a date" ;
}
}
?>
答案 7 :(得分:0)
<?php
function is_valid_date($user_date=false, $valid_date = "1900-01-01") {
$user_date = date("Y-m-d H:i:s",strtotime($user_date));
return strtotime($user_date) >= strtotime($valid_date) ? true : false;
}
echo is_valid_date("00-00-00") ? 1 : 0; // return 0
echo is_valid_date("3/5/2011") ? 1 : 0; // return 1
答案 8 :(得分:0)
我使用以下代码验证来自ExtJS应用程序的日期。
function check_sql_date_format($date) {
$date = substr($date, 0, 10);
list($year, $month, $day) = explode('-', $date);
if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) {
return false;
}
return checkdate($month, $day, $year);
}
答案 9 :(得分:-1)
<?php
function is_date( $str ) {
$stamp = strtotime( $str );
if (!is_numeric($stamp)) {
return FALSE;
}
$month = date( 'm', $stamp );
$day = date( 'd', $stamp );
$year = date( 'Y', $stamp );
if (checkdate($month, $day, $year)) {
return TRUE;
}
return FALSE;
}
?>