问题描述
我试图使用 Laravel-Excel 3.1 导入 csv 文件。在 csv 文件中有一个日期列,它的格式是“dd/mm/yy”,例如 -“24/07/20”。我正在使用 ToModel 方法。如何以“yyyy/mm/dd”格式保存数据库,例如-“2020/07/24”。我的代码如下。
class DeviceDataimport implements ToModel,WithheadingRow
{
private $counterNumber;
public function __construct($counterNumber)
{
headingRowFormatter::default('none');
$this->counter = $counterNumber;
}
public function model(array $row)
{
return new DeviceData([
'counter_id' => $this->counter,'date' => $row['DATE'],'amount' => $row['AMOUNT'
}
}
解决方法
嗨,您可以使用 Carbon 创建一个日期实例,因此您应该有
DeviceData::create([
'counter_id' => $this->counter,'date' => Carbon::createFromFormat('Y/m/d',$row['DATE']),'amount' => $row['AMOUNT']
]);
如果日期是其他明智的,您可能想要使用验证,但要确保它是那种格式
同样,我不知道 counter 是否是我所想的,但可以从导入中获取,请参阅 - https://docs.laravel-excel.com/3.1/imports/chunk-reading.html#keep-track-of-the-row-number
希望能帮到你,谢谢
,Carbon 的 createFromFormat()
要求您定义输入格式。
在这种情况下,24/07/20 的输入格式是 d/m/y
,而不是其他答案中使用的格式。
请参阅 PHP: DateTime::format 以获取参数列表。
'date' => Carbon::createFromFormat('d/m/y',
如果您不想使用 Carbon 实例保存模型,您可以将日期格式化为字符串。您可以在此处定义特定的输出格式。
'date' => Carbon::createFromFormat('d/m/y',$row['DATE'])->format('Y/m/d'),
,
最后,我采用了如下手动方法。
SELECT TO_DATE(NULLIF(dt,''),'yyyymmdd' or ’yyyy-MM-dd hh:mm:ss' or 'yyyy-MM-dd')
之后,我根据我的项目手动连接并重新格式化日期。
if(somedate==null){
}
else if(somedate.length==10){
somedate=str2date(somedate,"yyyy-MM-dd")
}else if(somedate.length==8){
somedate=str2date(somedate,"yyyyMMdd")
}else if (somedate.length==19){
somedate=str2date(somedate,"yyyy-MM-dd hh:mm:ss")
}else{
somedate=null
}
somedate=date2str(somedate,'yyyy-MM-dd hh:mm:ss')
我认为这不是一个很好的解决方案,但会在接下来的很多年里奏效。
感谢所有贡献想法的人。