我正在研究一个对象,该对象将日期和时间验证为更大的验证库的一部分。
某些函数将DateTime格式作为其参数之一。有没有办法检查字符串是否是有效的DateTime格式?
字符串不应该是日期,字符串应该是可以传递给Date::format()
的格式。
这是班级:
<?php
namespace ArgumentValidator;
use DateTime;
use InvalidArgumentException;
class DateTimeValidationRule implements IValidationRule
{
/** @var string $defaultDateTimeFormat */
private static $defaultDateTimeFormat = DATE_ATOM;
/** @var string $defaultDateFormat */
private static $defaultDateFormat = 'Y-m-d';
/** @var string $defaultTimeFormat */
private static $defaultTimeFormat = 'H:i:s';
/** @var string $dateTimeFormat */
private $dateTimeFormat;
public function __construct($dateTimeFormat = '') {
$this->dateTimeFormat = $dateTimeFormat != '' ? $dateTimeFormat : self::$defaultDateTimeFormat;
}
/** @return string */
public static function getDefaultDateTimeFormat() {
return self::$defaultDateTimeFormat;
}
/** @param string $defaultDateTimeFormat */
public static function setDefaultDateTimeFormat($defaultDateTimeFormat) {
self::$defaultDateTimeFormat = $defaultDateTimeFormat;
}
/** @return string */
public static function getDefaultDateFormat() {
return self::$defaultDateFormat;
}
/** @param string $defaultDateFormat */
public static function setDefaultDateFormat($defaultDateFormat) {
self::$defaultDateFormat = $defaultDateFormat;
}
/** @return string */
public static function getDefaultTimeFormat() {
return self::$defaultTimeFormat;
}
/** @param string $defaultTimeFormat */
public static function setDefaultTimeFormat($defaultTimeFormat) {
self::$defaultTimeFormat = $defaultTimeFormat;
}
/**
* @param string $value The value to validate
* @param bool $throwOnError Should throw an exception if it is invalid?
* @return ValidationResult
*/
public function validate($value, $throwOnError = true) {
$isValid = boolval(DateTime::createFromFormat($this->dateTimeFormat, $value));
if(!$isValid && $throwOnError) {
throw new InvalidArgumentException("Expected value to be in dateTime format: {$this->dateTimeFormat}");
}
return $isValid ? ValidationResult::makeSuccessResult() : ValidationResult::makeFailResult($this);
}
public function __toString() {
return "DateTime-{$this->dateTimeFormat}";
}
}
我需要在构造函数和所有静态setter中验证参数。
答案 0 :(得分:0)
我认为将字符串验证为有效的日期格式将是徒劳的,可能有数千个可能的字符串将导致有效的日期时间格式。我想你是想避免使用stupid things that DateTime::createFromFormat()
does。
验证给定的格式字符串是否产生预期日期要容易得多。我非常使用这个函数(以至于我把它变成了a factory I can install with composer): -
function validateDate($dateString, $format = 'Y-m-d H:i:s')
{
$d = \DateTime::createFromFormat($format, $dateString);
return $d && $d->format($format) == $dateString;
}
此功能在php.net无耻地被盗。
答案 1 :(得分:-2)
您可以创建一个辅助方法,如:
private function isValidDateTime($string) {
return (DateTime::createFromFormat('m/d/Y', $string) !== false);
}
哪会返回一个布尔结果,你可以在支票中使用。