#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 .