2016-01-20 74 views
1

我为其中发送到DateTime::modify($string)$string变量是从用户编辑数据库中读取的情况下,我怎么能验证$stringDateTime::modify()正确的字符串?的日期时间验证字符串输入::修改()

+0

可能这个链接会帮助你。 http://stackoverflow.com/questions/16075159/check-if-a-string-is-a-valid-date-using-datetime-tryparse –

+0

@RaviHirani你的链接问一个类似的C#问题,但我不是确定实现建议可以用PHP完成? –

回答

0

你可以做这样的事情,并调用它,你将字符串传递到您的实际日期之前:

function modifyIsValid($modifyString) { 
    $d = new DateTime(); 
    $isValid = $d->modify($modifyString); 

    if ($isValid === false) { 
     return false; 
    } 

    return true; 
} 

->modify()返回false是传递的字符串是无效的,虽然它也将引发增加一个E_Warning这是不理想的。

$d = new DateTime(); 
$string = 'not a valid modifier'; 

if (modifyIsValid($string)) { 
    // Continue 
} else { 
    // Print a friendly error message. 
} 

您可以在手册中找到有关它的更多信息:http://php.net/manual/en/datetime.modify.php

希望它能帮助。

+0

这看起来像是验证字符串的好方法,但我需要处理警告,这是否可以简单地禁止警告? –

+0

@ChristopherKarlsson这可能是摆脱错误的一种可能的方式,毕竟即使你压制了错误,你仍然在处理它,所以它应该没问题。执行检查的另一种方式最有可能使用正则表达式来验证字符串对所有在这里找到的有效格式:http://php.net/manual/en/datetime.formats.php – Mikey

+0

我会接受这个答案,因为它似乎是最接近你可以做一个干净的验证,即使它提出了一个警告,我会按照@pherris答案中的建议处理警告。 –

1

试试这个功能基于格式

function validateDate($date, $format = 'Y-m-d H:i:s') 
{ 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 

功能,从这个answerphp.net

+0

我正在使用此功能在应用修改功能之前检查日期的格式。我需要验证修改正确格式日期的字符串,该字符串应该被验证为DateTime :: modify()可以理解的字符串。 –

+0

从你的函数内部调用这个函数 –

+0

为什么你必须添加'$ d->格式($ format)== $ date'? – systemovich

0

复制验证时间戳字符串这之前它来检查用户输入通常的最佳实践保存到数据库中,以便您可以在出路时对其有信心。

你可以使用try/catch块,以及:

try { 
    $date = new DateTime('2016-12-12'); 
    $date->modify('+1 dayBLA'); 
    echo $date->format('Y-m-d'); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

编辑:看这个,如果传递给modify的字符串无效后(不是日期字符串,我原本应该),你的代码会抛出一个Warning也不例外。

可能能够触发Warning暂时作为例外与set_error_handler对待。

function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) { 
    throwErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler('warning_handler', E_WARNING); 

try { 
    $date = new DateTime('2016-12-12'); 
    $date->modify('+1 daybla'); 
    echo $date->format('Y-m-d'); 
} catch (Exception $e) { 
    echo 'Caught exception: ', $e->getMessage(), "\n"; 
} 

restore_error_handler(); 

但是,这开始看起来有点讨厌。在调用modify方法之前和之后,可能会比较清晰(在您的代码中,而不是您的日志中),以查看它们是否不同。

$date = new DateTime('2016-12-12'); 
$origDate = clone $date; //I believe this will get you an independent object 
$date->modify('+1 daybla'); 
if ($origDate == $date) { 
    echo "Bad value passed to modify, probably a warning in the logs :("; 
} 
+0

我同意输入前应该检查输入到数据库中,我这样做,但我也想在这方面验证,如果可能的话- 以防万一。我试着按照你的建议添加一个try和catch,但是当修改失败时,这仍然会引发警告。 –

+0

我只是注意到了 - 环顾四周后,我看不到一个很好的方法来做到这一点。很明显,你传递给'modify'的字符串的正则表达式是最好的,但是这个方法所使用的字符串似乎是非常不同的。也许你可以通过限制用户输入来解决问题,例如三个输入:1)'+'/'-',2)'小时'/'天'3)计数(一个int)。我用几个其他选项编辑了答案,你可以试试 - 祝你好运! – pherris

0

有点晚在这里聚会,这完全适用于我......

function isDateModifyValid($String) 
{ 
    if (strlen($String) == 0) { return false; } 
    $now = new \DateTime(null, new \DateTimeZone("UTC")); 
    $rtn = false; // Default return value 
    @$now->modify($String) && $rtn = true; 
    // If modify($string) fails, $rtn won't set to true, else $rtn will set to true 
    //^^ @ suppress error 
    return $rtn; 
} 

//TEST DATA 
foreach (array("+1 hour", "+2 hour, -5 minutes", "12:00", "dsfv", "13:00, + 1 hour", "Yesterday, 12:00", "Neext weeekc", "Next month") as $testString) 
{ 
    if (isDateModifyValid($testString)) 
    { 
     echo "VALID ::: $testString\n"; 
    } else { 
     echo "INVALID ::: $testString\n"; 
    } 
} 

VALID ::: +1 hour VALID ::: +2 hour, -5 minutes VALID ::: 12:00 INVALID ::: dsfv VALID ::: 13:00, + 1 hour VALID ::: Yesterday, 12:00 INVALID ::: Neext weeekc VALID ::: Next month

+0

你的回答补充说,其他人不知道? – GrumpyCrouton