Как я могу создать DateTime с форматом "n Y" и управлять ошибочными датами, используя DateTime :: createFromFormat - PullRequest
0 голосов
/ 10 марта 2020

Мне нужно создать одну дату, используя только month и year.

Я использую этот код:

$mData="1 2003";
$mDate=DateTime::createFromFormat("n Y", $mData);
var_dump($mDate);

Вывод в этом случае в порядке:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2003-01-10 15:43:33.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

Теперь я пытаюсь с одним месяцем, который не существует:

$mData="21 2003";
$mDate=\DateTime::createFromFormat("n Y", $mData);
var_dump($mDate);

Выходными данными является одна дата сентября 2004 года!:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2004-09-10 15:45:26.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}

Почему в этом случае $mDate не false o нет ли ошибок?

Невозможно создать один действительный объект DateTime таким образом, контролируя даты ошибок.

В моем сценарии я не могу изменить формат "n Y" на другой формат, , тогда мне нужно добиться этого контроля ошибок? Это возможно?

Ответы [ 3 ]

1 голос
/ 10 марта 2020

Теперь я пытаюсь с одним месяцем, который не существует 21

21 = 12 + 9 = 1y + 9m

Что именно вы получаете

string(26) "2004-09-10 15:45:26.000000"
0 голосов
/ 11 марта 2020

Вы можете проверить, совпадает ли год объекта DateTime с годом ввода:

$mData = "13 2003";
$mDate = \DateTime::createFromFormat ("!n Y", $mData);


$error = ($mDate === false OR strpos($mData, $mDate->format('Y')) < 2) ;

var_dump($error);  //bool(true)

или вы используете date_get_last_errors (). Эта функция выдает предупреждение, которое вы можете оценить.

$mData = "21 2003";
$mDate = \DateTime::createFromFormat ("!n Y", $mData);

var_dump(date_get_last_errors());

вывод:

array(4) {
  ["warning_count"]=>
  int(1)
  ["warnings"]=>
  array(1) {
    [7]=>
    string(27) "The parsed date was invalid"
  }
  ["error_count"]=>
  int(0)
  ["errors"]=>
  array(0) {
  }
}

Примечание: Формат "! N Y" приводит к дате с день 1 и время 00:00.

$mData = "5 2003";
$mDate = \DateTime::createFromFormat ("!n Y", $mData);

$error = ($mDate === false OR strpos($mData, $mDate->format('Y')) < 2) ;

var_dump($mDate,$error);  

Выход:

object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2003-05-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(13) "Europe/Berlin"
}
bool(false)
0 голосов
/ 10 марта 2020

Как указывает другой ответ, поведение - это поведение, поэтому вы можете проверить себя:

$mData = "21 2003";

$a = explode(' ', $mData);

var_dump(
    checkdate($a[0], 1, $a[1])
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...