我为其中发送到DateTime::modify($string)
的$string
变量是从用户编辑数据库中读取的情况下,我怎么能验证$string
是DateTime::modify()
正确的字符串?的日期时间验证字符串输入::修改()
回答
你可以做这样的事情,并调用它,你将字符串传递到您的实际日期之前:
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
希望它能帮助。
这看起来像是验证字符串的好方法,但我需要处理警告,这是否可以简单地禁止警告? –
@ChristopherKarlsson这可能是摆脱错误的一种可能的方式,毕竟即使你压制了错误,你仍然在处理它,所以它应该没问题。执行检查的另一种方式最有可能使用正则表达式来验证字符串对所有在这里找到的有效格式:http://php.net/manual/en/datetime.formats.php – Mikey
我会接受这个答案,因为它似乎是最接近你可以做一个干净的验证,即使它提出了一个警告,我会按照@pherris答案中的建议处理警告。 –
试试这个功能基于格式
function validateDate($date, $format = 'Y-m-d H:i:s')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
我正在使用此功能在应用修改功能之前检查日期的格式。我需要验证修改正确格式日期的字符串,该字符串应该被验证为DateTime :: modify()可以理解的字符串。 –
从你的函数内部调用这个函数 –
为什么你必须添加'$ d->格式($ format)== $ date'? – systemovich
复制验证时间戳字符串这之前它来检查用户输入通常的最佳实践保存到数据库中,以便您可以在出路时对其有信心。
你可以使用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 :(";
}
我同意输入前应该检查输入到数据库中,我这样做,但我也想在这方面验证,如果可能的话- 以防万一。我试着按照你的建议添加一个try和catch,但是当修改失败时,这仍然会引发警告。 –
我只是注意到了 - 环顾四周后,我看不到一个很好的方法来做到这一点。很明显,你传递给'modify'的字符串的正则表达式是最好的,但是这个方法所使用的字符串似乎是非常不同的。也许你可以通过限制用户输入来解决问题,例如三个输入:1)'+'/'-',2)'小时'/'天'3)计数(一个int)。我用几个其他选项编辑了答案,你可以试试 - 祝你好运! – pherris
有点晚在这里聚会,这完全适用于我......
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
你的回答补充说,其他人不知道? – GrumpyCrouton
- 1. 验证字符串输入
- 2. Ragel - 输入时验证字符串
- 3. 在C++中验证字符串和日期输入?
- 4. 转换字符串以键入日期或输入时间
- 5. 字符串日期时间
- 6. 如何在javascript中修改日期和时间字符串的时间部分
- 7. 日期输入验证asp.net
- 8. 日期输入字段验证
- 9. 如何以短时间格式验证输入字符串
- 10. 无法验证日期时间字段
- 11. 验证时间和日期字段
- 12. SSRS中的日期时间参数 - 输入验证
- 13. 日期时间验证
- 14. Android:日期/时间验证
- 15. 验证日期和时间
- 16. 验证日期tru时间
- 17. Elasticsearch日期字段:时代毫秒输入,字符串输出?
- 18. 在JQuery中的输入字段中输入日期验证
- 19. 验证字符串用户输入
- 20. 验证用户输入字符串
- 21. 将日期时间字符串转换为日期时间
- 22. 转换日期/时间字符串值到.NET日期时间
- 23. 剑道日期时间选择器验证输入
- 24. AngularJS日期和时间选择器自定义输入验证
- 25. HQL中的日期时间字符串
- 26. 到日期时间的字符串
- 27. 到日期时间的字符串
- 28. 使用MomentJS验证日期格式(不是日期字符串)?
- 29. 验证两个字符串之间的用户输入?
- 30. 什么是正确的方式来处理日期时间从Qt中的字符串输入日期时间
可能这个链接会帮助你。 http://stackoverflow.com/questions/16075159/check-if-a-string-is-a-valid-date-using-datetime-tryparse –
@RaviHirani你的链接问一个类似的C#问题,但我不是确定实现建议可以用PHP完成? –