Неожиданный результат Carbon createFromFormat

::createFromFormat() приводит к опережению на один месяц:

var_dump($_GET['archive']);
var_dump(Carbon::createFromFormat('m/Y', $_GET['archive']));

Результат:

string '11/2015' (length=7)
object(Carbon\Carbon)[160]
  public 'date' => string '2015-12-01 10:38:41.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)

person leevanoetz    schedule 31.07.2016    source источник
comment
У меня такая же проблема, но со временем зависит от даты. $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


Ответы (2)


Похоже, вам просто не повезло, потому что вы тестировали 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

Кажется, что Carbon использует текущий день, если он не указан. Следовательно

var_dump(Carbon::createFromFormat('m/Y', '10/2015'));
var_dump(Carbon::createFromFormat('m/Y', '11/2015'));

результаты напр. 31 июля в

object(Carbon\Carbon)[156]
  public 'date' => string '2015-10-31 11:03:10.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)
object(Carbon\Carbon)[138]
  public 'date' => string '2015-12-01 11:03:10.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/London' (length=13)

как в октябре 31, но «31 ноября на самом деле 1 декабря».

person leevanoetz    schedule 31.07.2016