如何判断字符串是否代表有效的日期时间格式?

时间:2016-10-11 20:09:35

标签: php datetime

我正在研究一个对象,该对象将日期和时间验证为更大的验证库的一部分。

某些函数将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中验证参数。

2 个答案:

答案 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);
}

哪会返回一个布尔结果,你可以在支票中使用。