Проблема с датой и временем с PHP 7.4 при выполнении json_encode (я использую Carbon)

Я обновил PHP с 7.0 до 7.4, и мой код ведет себя иначе, когда я помещаю datatime в json_encode. Я видел эту проблему среди ошибок PHP, но не знаю, как ее исправить. Ошибка 78383 Bugs.php

теперь, если я использую json_decode с datetime, я получаю void array [] даты.

Для этого кода:

$dataTest['text'] = "some text for the example";
$dataTest['date'] = Carbon::now();
$dateEncode = json_encode($dataTest);
$dateDecode = json_decode($dateEncode, TRUE);
dd($dataTest, $dateEncode, $dateDecode);

Я получил:

array:2 [▼
  "text" => "some text for the example"
  "date" => Carbon {#905 ▼
    +"date": "2021-04-14 10:03:28.736535"
    +"timezone_type": 3
    +"timezone": "Europe/Madrid"
  }
]
"{"text":"some text for the example","date":[]}"
array:2 [▼
  "text" => "some text for the example"
  "date" => []
]

Я могу заставить Carbon быть массивом до json_encode, но это большая работа, чтобы исправить весь мой код. Для этого кода:

$dataTest['text'] = "some text for the example";
$dataTest['date'] = (array)Carbon::now();
$dateEncodeArray = json_encode($dataTest);
$dateDecodeArray = json_decode($dateEncodeArray, TRUE);
dd($dateEncodeArray, $dateDecodeArray );

Я получил:

"{"text":"some text for the example","date":{"date":"2021-04-14 10:09:32.481792","timezone_type":3,"timezone":"Europe\/Madrid"}}"
array:2 [▼
  "text" => "some text for the example"
  "date" => array:3 [▼
    "date" => "2021-04-14 10:09:32.481792"
    "timezone_type" => 3
    "timezone" => "Europe/Madrid"
  ]
]

Я использую Carbon 1 (nesbot / carbon 1.32.0 Простое расширение API для DateTime.)

Кто-то с такой же проблемой? Большое спасибо,


person Maria Paricio Blasco    schedule 14.04.2021    source источник


Ответы (2)


Вы можете настроить для Carbon 1 и 2 способ вывода экземпляра Carbon в JSON в любом формате:

Carbon::serializeUsing(function ($date) {
    return $date->tz('UTC')->format('Y-m-d\TH:i:s.up');
});

echo json_encode(Carbon::now());

Это даст вам тот же формат, что и Carbon 2 по умолчанию.

Очевидно, вам следует выполнить обновление, у вас есть 54 второстепенных версии, вы должны справиться с этим сразу, и это избавит вас от многих проблем, связанных с обновлением, вместо того, чтобы работать над несовместимостью, чтобы придерживаться неподдерживаемой версии.

person KyleK    schedule 14.04.2021
comment
Спасибо, вы спасли мне день: D Я хочу обновить его в ближайшее время, но сейчас это невозможно. - person Maria Paricio Blasco; 15.04.2021

Просто обновите Carbon до более свежей версии, и все будет в порядке:

$ composer require nesbot/carbon "^2.46"

Теперь смело можно делать:

$data = json_decode(json_encode(['date' => Carbon::now()]), true);

Вывалили, что даст вам:

array (

  'date' => '2021-04-14T12:53:04.403585Z',
)

Если вам нужно временно использовать Carbon 1.x, вы также можете попытаться замаскировать Carbon:

use Carbon\Carbon as Charcoal; // Alias Carbon

class Carbon { // Mask original Carbon

    public static function __callStatic($method, $args) {

        // Whatever the given Carbon method returns, cast it to an array
        return (array) Charcoal::{$method}(...$args);  
    }

    // Add more methods as needed 
}
person nosurs    schedule 14.04.2021
comment
Я не могу сделать это в краткосрочной перспективе, есть изменения, которые нарушают код при переходе с углерода 1 на углерод 2, среди них именно обработка углерода в jsons. carbon.nesbot.com/docs/#api-carbon-2 - person Maria Paricio Blasco; 14.04.2021
comment
Я пересмотрел свой ответ, чтобы учесть Углерод 1. Маскирование Углерода (как показано в моем ответе) должно избавить вас от необходимости искать и заменять все вхождения вызовов метода Углерода, хотя вам все равно придется изменить свои объявления use на псевдоним Карбон и для ссылки на заменяющий класс. - person nosurs; 14.04.2021