从Carbon对象中仅获取时间

4

我正在阅读一个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->格式("H:i:s")会起作用,但我得到了错误“尝试获取非对象的属性'date'”。
编辑2:这是我读取数据的方式:
Excel表格如下:
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();
}

输出结果:
调用一个空对象的方法format()。

你可以展示一下实际上填充$value的代码吗? - Patrick Q
你应该能够使用$value["time"]->toTimeString(),但是除非你在print_r和代码的其他部分之间进行了操作,否则你得到的错误很有趣。 - aynber
我已经尝试了所有的建议。@PatrickQ 好的,我会编辑我的问题并加上那一部分。 - pmiranda
请尝试使用Carbon :: createFromFormat下面我建议的答案。它应该可以正常工作,无论$data [“time”]是否为carbon格式。 - eResourcesInc
你调用 createFromFormat() 返回了 null,因为格式与你的 time 列的格式不匹配。你在问题中提到的错误实际上是由什么原始代码引起的?你是如何创建 $value 的,以至于在一个地方它被视为对象,在另一个地方却不是? - Patrick Q
显示剩余7条评论
2个回答

20

你需要的是这里的格式:

$dt = Carbon::now();
$dt->toTimeString(); //14:15:16

4

Carbon\Carbon是php的DateTime扩展,您可以在php.net上了解更多信息。

虽然America/US不是有效的时区,所以这里可能会出现一些问题。

无论如何,

在数据库中我得到:2018-10-30 01:45:00

如果您的数据类型是TIMESTAMP或DATETIME,则mysql始终会为该列中的数据具有日期组件。

首先,让我们从$value数组中取出时间,以便更容易理解和调试其余部分:

$time = $value["time"];

从现在开始,不要关注var_dump揭示的内部字段。它们可能实际上并不存在于对象中。使用上面链接或Carbon文档中记录的大多数有良好文档记录的接口方法。否则,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);
}

您正在尝试使用createFromFormat()方法创建一个Carbon实例。您提供的第一个参数告诉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 reader 实际上返回的是 Carbon 对象而不是字符串,您可以完全消除 createFromFormat 代码。没必要将一个 Carbon 对象制成另一个 Carbon 对象。


我正在使用PostgreSQL,而“time”是一个varchar。 - pmiranda
那么,上述任何版本生成的$timestr都应该是可以的。 - Jerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接