Начну с того, что я большой сторонник использования объекта DateTime, который позволяет вам использовать функцию DateTime::createFromFormat()
.Объект DateTime делает код намного более читабельным и избавляет от необходимости делать всю модификацию метки времени Unix, используя 60 * 60 * 24 для продвижения дней даты.
При этом произвольная строка, которую принимает strtotime ()не очень сложно предсказать. Поддерживаемые форматы даты и времени содержит список поддерживаемых форматов.
В соответствии с вашим примером неспособности провести различие между MM / DD / YYYY и DD / MM / YYYY, он различает на основев форматах даты .Даты, которые используют косую черту, всегда читаются как американский формат.Таким образом, дата в формате 00/00/0000 всегда будет читаться как ММ / ДД / ГГГГ.Альтернативно использование тире или точек будет DMY.например, 00-00-0000 всегда будет читаться как ДД-ММ-ГГГГ.
Вот несколько примеров:
<?php
$dates = array(
// MM DD YYYY
'11/12/2013' => strtotime('2013-11-12'),
// Using 0 goes to the previous month
'0/12/2013' => strtotime('2012-12-12'),
// 31st of November (30 days) goes to 1st December
'11/31/2013' => strtotime('2013-12-01'),
// There isn't a 25th month... expect false
'25/12/2013' => false,
// DD MM YYYY
'11-12-2013' => strtotime('2013-12-11'),
'11.12.2013' => strtotime('2013-12-11'),
'31.12.2013' => strtotime('2013-12-31'),
// There isn't a 25th month expect false
'12.25.2013' => false,
);
foreach($dates as $date => $expected) {
assert(strtotime($date) == $expected);
}
Как видите, несколько ключевых примеров: 25/12/2013
и 12.25.2013
, которые оба были бы действительны, если считывать в противоположном формате, однако они возвращают false
, поскольку они недопустимы в соответствии с поддерживаемыми форматами даты и времени ...
Так что, как видите, поведение вполне предсказуемо.Как всегда, если вы получаете дату от ввода данных, вы должны сначала проверить эти данные.Никакой метод не сработает, если вы сначала не проверяете ввод.
Если вы хотите быть очень точным в отношении читаемой даты, или заданный вами формат не поддерживается, то я рекомендую использоватьDateTime::createFromFormat()
.