Php 正确确定日期字符串是否为该格式的有效日期
我从API接收到一个日期字符串,它的格式为Php 正确确定日期字符串是否为该格式的有效日期,php,date,datetime,Php,Date,Datetime,我从API接收到一个日期字符串,它的格式为yyyy-mm-dd 我目前正在使用一个正则表达式来验证字符串格式,它可以正常工作,但我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。i、 例如,e.2013-13-01 在PHP中,有没有更好的方法来获取字符串,例如2013-13-01,并判断它是否是格式yyy-mm-dd的有效日期?您可以用于此目的: 函数validateDate($date,$format='Y-m-d') { $d=DateTime::createFro
yyyy-mm-dd
我目前正在使用一个正则表达式来验证字符串格式,它可以正常工作,但我可以看到一些情况,根据字符串,它可能是正确的格式,但实际上是无效的日期。i、 例如,e.2013-13-01
在PHP中,有没有更好的方法来获取字符串,例如2013-13-01
,并判断它是否是格式yyy-mm-dd
的有效日期?您可以用于此目的:
函数validateDate($date,$format='Y-m-d')
{
$d=DateTime::createFromFormat($format,$date);
//对于任何位数的整数,Y(4位数年份)返回TRUE,因此将比较从==更改为===可以解决问题。
返回$d&&$d->format($format)===$date;
}
[函数取自。也是在。最初由编写人编写。]
测试用例:
var_dump(validateDate('2013-13-01')); // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32')); // false
var_dump(validateDate('2012-2-25')); // false
var_dump(validateDate('2013-12-01')); // true
var_dump(validateDate('1970-12-01')); // true
var_dump(validateDate('2012-02-29')); // true
var_dump(validateDate('2012', 'Y')); // true
var_dump(validateDate('12012', 'Y')); // false
您可以为此目的使用:
函数validateDate($date,$format='Y-m-d')
{
$d=DateTime::createFromFormat($format,$date);
//对于任何位数的整数,Y(4位数年份)返回TRUE,因此将比较从==更改为===可以解决问题。
返回$d&&$d->format($format)===$date;
}
[函数取自。也是在。最初由编写人编写。]
测试用例:
var_dump(validateDate('2013-13-01')); // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32')); // false
var_dump(validateDate('2012-2-25')); // false
var_dump(validateDate('2013-12-01')); // true
var_dump(validateDate('1970-12-01')); // true
var_dump(validateDate('2012-02-29')); // true
var_dump(validateDate('2012', 'Y')); // true
var_dump(validateDate('12012', 'Y')); // false
您还可以解析月份日期和年份的日期,然后可以使用PHP函数
checkdate()
,您可以在此处阅读:
你也可以试试这个:
$date="2013-13-01";
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date))
{
echo 'Date is valid';
}else{
echo 'Date is invalid';
}
您还可以解析月份日期和年份的日期,然后可以使用PHP函数
checkdate()
,您可以在此处阅读:
你也可以试试这个:
$date="2013-13-01";
if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date))
{
echo 'Date is valid';
}else{
echo 'Date is invalid';
}
确定任何字符串是否为日期
function checkIsAValidDate($myDateString){
return (bool)strtotime($myDateString);
}
确定任何字符串是否为日期
function checkIsAValidDate($myDateString){
return (bool)strtotime($myDateString);
}
以简单的方式使用php预构建函数:
function checkmydate($date) {
$tempDate = explode('-', $date);
// checkdate(month, day, year)
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
$date = '2019-02-30';
$date_parts = explode( '-', $date );
if(checkdate( $date_parts[1], $date_parts[2], $date_parts[0] )){
//date is valid
}else{
//date is invalid
}
测试
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
以简单的方式使用php预构建函数:
function checkmydate($date) {
$tempDate = explode('-', $date);
// checkdate(month, day, year)
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
$date = '2019-02-30';
$date_parts = explode( '-', $date );
if(checkdate( $date_parts[1], $date_parts[2], $date_parts[0] )){
//date is valid
}else{
//date is invalid
}
测试
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
此选项不仅简单,而且几乎可以接受任何格式,尽管对于非标准格式,它可能有缺陷
$timestamp = strtotime($date);
return $timestamp ? $date : null;
此选项不仅简单,而且几乎可以接受任何格式,尽管对于非标准格式,它可能有缺陷
$timestamp = strtotime($date);
return $timestamp ? $date : null;
与cl sah的答案一致,但这听起来更好,更短
function checkmydate($date) {
$tempDate = explode('-', $date);
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
试验
与cl sah的答案一致,但这听起来更好,更短
function checkmydate($date) {
$tempDate = explode('-', $date);
return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}
试验
确定字符串是否为日期,即使字符串是非标准格式
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
(strotime不接受任何自定义格式)
确定字符串是否为日期,即使字符串是非标准格式
checkmydate('2015-12-01'); //true
checkmydate('2015-14-04'); //false
(strotime不接受任何自定义格式)
即使使用PHP,我也喜欢找到功能性的解决方案。例如,@migli给出的答案非常好,非常灵活和优雅
但它有一个问题:如果需要验证许多具有相同格式的日期时间字符串,该怎么办?你必须在所有地方重复这种格式,这与DRY原则背道而驰。我们可以将格式放在常量中,但仍然必须将常量作为参数传递给每个函数调用
但是不要再害怕了!我们可以用咖喱来拯救我们!PHP并不能使这项任务令人愉快,但仍然可以使用PHP实现Curry:
<?php
function validateDateTime($format)
{
return function($dateStr) use ($format) {
$date = DateTime::createFromFormat($format, $dateStr);
return $date && $date->format($format) === $dateStr;
};
}
是的,没什么区别。。。但真正的力量来自于部分应用的功能,通过以下方式实现:
// Get a partially applied function
$validate = validateDateTime('Y-m-d H:i:s');
// Now you can use it everywhere, without repeating the format!
$validate('2017-02-06 17:09:31'); // true
$validate('1999-03-31 07:07:07'); // true
$validate('13-2-4 3:2:45'); // false
函数式编程FTW我有一个东西,即使使用PHP,我也喜欢找到功能性的解决方案。例如,@migli给出的答案非常好,非常灵活和优雅
但它有一个问题:如果需要验证许多具有相同格式的日期时间字符串,该怎么办?你必须在所有地方重复这种格式,这与DRY原则背道而驰。我们可以将格式放在常量中,但仍然必须将常量作为参数传递给每个函数调用
但是不要再害怕了!我们可以用咖喱来拯救我们!PHP并不能使这项任务令人愉快,但仍然可以使用PHP实现Curry:
<?php
function validateDateTime($format)
{
return function($dateStr) use ($format) {
$date = DateTime::createFromFormat($format, $dateStr);
return $date && $date->format($format) === $dateStr;
};
}
是的,没什么区别。。。但真正的力量来自于部分应用的功能,通过以下方式实现:
// Get a partially applied function
$validate = validateDateTime('Y-m-d H:i:s');
// Now you can use it everywhere, without repeating the format!
$validate('2017-02-06 17:09:31'); // true
$validate('1999-03-31 07:07:07'); // true
$validate('13-2-4 3:2:45'); // false
函数式编程FTW经测试的正则表达式解决方案:
function isValidDate($date)
{
if (preg_match("/^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/", $date)) {
return $date;
}
return null;
}
如果日期无效或不是yyyy-mm-dd格式,则返回null,否则返回日期。测试正则表达式解决方案:
function isValidDate($date)
{
if (preg_match("/^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/", $date)) {
return $date;
}
return null;
}
如果日期无效或不是yyyy-mm-dd格式,则返回null,否则将返回日期。检查给定日期是否有效的最简单方法可能是使用strotime
将其转换为unixtime,将其格式化为给定日期的格式,然后进行比较:
函数isValidDate($date){
返回日期('Y-m-d',strotime($date))==$date;
}
当然,您可以使用正则表达式来检查有效性,但它仅限于给定的格式,每次您都必须对其进行编辑以满足其他格式的要求,而且它将超出要求。内置函数是实现作业的最佳方式(在大多数情况下)。检查给定日期是否有效的最简单方式可能是使用strotime将其转换为unixtime,将其格式化为给定日期的格式,然后进行比较:
/**** date check is a recursive function. it's need 3 argument
MONTH,DAY,YEAR. ******/
$always_valid_date = $this->date_check($month,$day,$year);
private function date_check($month,$day,$year){
/** checkdate() is a php function that check a date is valid
or not. if valid date it's return true else false. **/
$status = checkdate($month,$day,$year);
if($status == true){
$always_valid_date = $year . '-' . $month . '-' . $day;
return $always_valid_date;
}else{
$day = ($day - 1);
/**recursive call**/
return $this->date_check($month,$day,$year);
}
}
函数isValidDate($date){
返回日期('Y-m-d',strotime($date))==$date;
}
当然,您可以使用正则表达式来检查有效性,但它仅限于给定的格式,每次您都必须对其进行编辑以满足其他格式的要求,而且它将超出要求。内置函数是最好的