Получение только времени от объекта Carbon - PullRequest
0 голосов
/ 30 октября 2018

Я читаю в файле Excel столбец со значениями вроде "1:45:00. Но когда print_r($value["time"]) это значение из моего массива, я получил объект Carbon, подобный этому:

Carbon\Carbon Object
(
    [date] => 2018-10-30 01:45:00.000000
    [timezone_type] => 3
    [timezone] => America/US
)

Затем, когда я вставляю в массив массивов мое значение с помощью:

"time"=>$value["time"]

В базе данных я получил: 2018-10-30 01:45:00

Как я могу вставить только 01:45:00, а не всю метку времени?

РЕДАКТИРОВАТЬ: Я думал, что $value["time"]->date->format("H:i:s") будет работать, но я получил ошибку "Попытка получить свойство 'date' не-объекта"

РЕДАКТИРОВАТЬ 2: Вот как я читаю данные:

Превосходство как:

date         time
----------   -------
30-10-2018   01:45:00

Код, в котором я читаю Excel:

$data = Excel::selectSheetsByIndex(0)->load($path, function($reader) {
})->get()->toArray();

foreach ($data as $key => $value) {
    $time = Carbon::createFromFormat('Y-m-d h:i:s',$value["time"])->format('h:i:s');
    print_r($time);
    die();
}

Выход:

Call to a member function format() on null

1 Ответ

0 голосов
/ 31 октября 2018

Carbon \ Carbon является расширением DateTime php, поэтому вы можете прочитать на php.net , чтобы узнать больше.

Хотя America/US не является действительным часовым поясом, поэтому с этим что-то происходит.

В любом случае,

В базе данных я получил: 2018-10-30 01: 45: 00

Если ваш тип данных - TIMESTAMP или DATETIME, mysql всегда будет иметь компонент даты для данных в этом столбце.

Во-первых, давайте выделим время из массива $value, чтобы облегчить понимание и отладку оставшейся части обсуждения:

$time = $value["time"];

С этого момента, не обращайте внимания на внутренние поля, раскрываемые var_dump . На самом деле они могут существовать или не существовать в объекте. Используйте наиболее хорошо документированные методы интерфейса, описанные в ссылке выше или в Carbon docs . В противном случае поля, заданные var_dump, будут сбивать вас с толку.

Если вы просто хотите, чтобы время дня было представлено в виде строки, вы используете метод DateTime :: format ():

$timestr = $time->format('H:i:s');

Обратите внимание, что если вы вставите эту строку в базу данных с типом столбца DATETIME, она не будет работать. Mysql потребует строку с информацией о дате.

Следующий фрагмент кода не соответствует приведенному выше коду:

$data = Excel::selectSheetsByIndex(0)->load($path, function($reader) {
})->get()->toArray();

foreach ($data as $key => $value) {
    $time = Carbon::createFromFormat('Y-m-d h:i:s',$value["time"])->format('h:i:s');
    print_r($time);
}

Вы пытаетесь создать экземпляр Carbon, используя метод createFromFormat () . Первый предоставленный вами параметр сообщает Carbon (на самом деле DateTime), каким будет формат вашей входной строки. Данные, которые вы предоставляете, равны H:i:s (при условии, что $ value ["time"] считывается из столбца времени на листе Excel), но вы сообщаете Carbon, что вы дадите ему Y-m-d h:i:s. Поскольку формат, который вы обещаете, не соответствует данным, которые вы предоставляете объекту, в результате получается значение NULL.

Либо (разбито на шаги для ясности):

$time = Carbon::createFromFormat('H:i:s', $value["time"]);
$timestr = $time->format('h:i:s');

или

$time = Carbon::createFromFormat('d-m-Y H:i:s', $value["date"] . " " . $value["time"]);
$timestr = $time->format('h:i:s');

будет работать.

Второй дает вам объект Carbon, который гораздо более полезен - первый, вероятно, будет иметь нулевой год по умолчанию. В обоих случаях часовой пояс будет зоной машины, на которой выполняется код. Вы можете переопределить это при необходимости.

Обратите внимание, что если я запутался, и программа чтения Excel фактически возвращает объекты Cabon, а не строки, вы можете полностью исключить весь код createFromFormat. Нет смысла делать объект Carbon из объекта Carbon.

...