Похоже, вам просто не повезло, потому что вы тестировали 31-го числа месяца.
Однако это (видимо) задокументированная функция. См.: http://php.net/manual/en/datetime.createfromformat.php< /а>
Если вы установите маску формата «правильно», она будет работать так, как вы ожидаете.
$x = Carbon::createFromFormat ('m/Y', '04/2009');
$y = DateTime::createFromFormat ('m/Y|', '04/2009');
dd ($x, $y);
Чтобы избежать двусмысленности, функция Carbon
является просто оболочкой базовой функции DateTime
PHP; Я просто хочу доказать, что это не Carbon
функция, которая вызывает у нас головную боль.
Если вы тестируете 31-е число месяца, $x
выше будет читаться как 31 April 2009
, что будет отображаться как 1 мая.
Однако с символом трубы в маске все необъявленные переменные времени (H
, i
, s
) установлены в ноль, а переменные даты (d
, m
) установлены в 1, поэтому $y
всегда будет реагировать так, как вы ожидаете, независимо от день недели.
Для моего тестирования в 17:46 вечера 4-го числа месяца приведенный выше код выдает следующее:
Carbon @1233769590 {#219 ▼
date: 2009-02-04 17:46:30.0 Europe/London (+00:00)
}
DateTime @1233446400 {#217 ▼
date: 2009-02-01 00:00:00.0 Europe/London (+00:00)
}
На мой взгляд, это действительно странная реализация функции даты/времени. Единственная реальная ситуация, в которой вы хотели бы использовать эту функцию, — это если вы читаете данные из внешнего источника (например, поле «дата» XML).
Какой программист на земле захочет, чтобы его программа предполагала, что отсутствующий компонент времени (или, в вашем случае, день) входящих данных должен быть взят из времени выполнения во время выполнения? Это абсолютно сумасшедшие помешанные.
person
cartbeforehorse
schedule
04.12.2017
$x = Carbon::createFromFormat ('Y-m-d', '2017-11-21');
создает$x
с2017-11-21 16:55
(поскольку сейчас 16:55 по моему местному времени). Я хочу (ожидаю), что он вернет время00:00
. Это глючит, если вы спросите меня. Какой смысл в функции форматирования, которая не обнуляет неопределенный оператор формата!?!? - person cartbeforehorse   schedule 04.12.2017