Как я могу определить, представляет ли строка допустимый формат даты и времени?

#php #datetime

#php #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 amp;amp; $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}";
    }
}
  

Мне нужно проверить аргумент в конструкторе и во всех статических установщиках.

Комментарии:

1. checkdate , date_parse

2. Он хочет проверить format , а не саму дату

3. Я предполагаю, что вам нужно поместить каждый допустимый формат, найденный в date pag, в массив и проверить, содержит ли ваша строка только символы из этого массива

4. итак, вы хотите подтвердить, что '%y-%m-%d ‘ — это то, что внутренние компоненты php примут как допустимую строку формата даты / времени, а не то, что '2016-10-12' будет правильно проанализировано в соответствии с этим форматом?

Ответ №1:

Я бы предположил, что проверка строки как допустимого формата даты будет бесполезным упражнением, вероятно, существуют тысячи возможных строк, которые приведут к допустимому формату даты и времени. Я думаю, вы пытаетесь избежать глупостей, которые это DateTime::createFromFormat() делает.

Будет намного проще проверить, что данная строка формата выдает ожидаемую дату. Я использую эту функцию довольно часто (настолько, что превратил ее в фабрику, которую я могу установить с помощью composer):-

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

Эта функция была бесстыдно украдена из php.net .