【问题标题】:Import csv with wrong format date to MySQL with Symfony-php使用 Symfony-php 将格式日期错误的 csv 导入 MySQL
【发布时间】:2020-10-10 14:23:45
【问题描述】:

我正在尝试使用 symfony/php 将 csv 文件上传到我的 mysql 表。

                                    ...

while (($data = fgetcsv($handle, 0, ";")) !== false) {

                    $count++;
                    if ($count == 1) { continue; }

                    $entity = new Oasice();
 
                    $entity->setCentre($data[0]);
                    $entity->setAffaire($data[1]);
                    $entity->setTypeAffaire($data[2]);
                    $entity->setTypeDossier($data[3]);
                    $entity->setCommune($data[4]);
                    $entity->setCodeInsee($data[5]);
                    $entity->setMoaEr($data[6]);
                    $entity->setDateAmeoAmheo($data[7]); // date
                    $entity->setChargeAffaire($data[8]);
                    // a lot more column...

在这个文件中,我有十列日期格式为dd/mm/YYYY,这给与数据库的集成带来了问题。

我尝试了迄今为止我能找到的解决方案(例如:this),但没有任何结论。

例子

$date = date("Y-m-d", strtotime(str_replace('/', '-', $data[7])));
dump($date)

但我的结果通常是 01-01-19701970-01-01 或空字符串。

编辑:

文件多列中的日期格式示例:

请问我该怎么办?我做错了什么?

【问题讨论】:

  • 你应该给我们一些例子,在你得到错误结果的情况下,你的日期在你的文件中是如何查看的。
  • 日期都是这种格式: : 04/04/2018 04/09/2020 19/07/2017
  • 你检查过$ data[7]在某些情况下是否为空吗?
  • 我不清楚您使用的是什么 Doctrine 版本。但是,如果您将实体的dateAmeoAmheo 属性指定为Doctrine date column types 之一,您应该只给setDateAmeoAmheo 提供一个DateTimeInterface 实例,Doctrine 将为您管理适当的日期转换。因此,也许在将 csv 的日期值传递给您的实体之前将其转换为 DateTime 实例。
  • 是的,$data[7] 有时是空的

标签: php mysql csv symfony


【解决方案1】:

基本上date_create_from_formatDate::createFromFormat 的别名)可以创建各种格式的日期,尤其是数字变体(就像您自己链接的答案中一样):

$date = date_create_from_format('d/m/Y', $data[7]);

// then turn it into the format you want, like Y-m-d:
// $mysqlDate = $date->format('Y-m-d');
// or assign it to your entity
$entity->setDateAmeoAmheo($date);

如果您有多种格式,则可以使用回退,因为 date_create_from_format 将在错误时返回 false

$date = date_create_from_format('d/m/Y', $data[7]) 
     ?: date_create_from-format('d/m/y', $data[7])
     // and so on, if needed.
;
// rest as before

【讨论】:

    【解决方案2】:

    我想我找到了解决方案,不一定是我猜的最好的,但我会考虑的。

    我将尝试在我的所有列上使用日期和空字符串执行此过程

    如果可以的话,我会及时通知你

          ```   $date7 = explode("/", $data[7]);
                    //dump($date);
                    if ($date7[0] !== "")
                    {
                        $ladateameo = '"'.$date7[2].'-'.$date7[1].'-'.$date7[0].'"';
                    }
                    else
                    {
                        $ladateameo = NULL; 
                    }
                    //dump($ladateameo);
                    $entity->setDateAmeoAmheo($ladateameo); // date    data[7] ```
    

    编辑:

                        $date9 = explode("/", $data[9]);
                        dump($date9);
                        if ($date9[0] !== "")
                        {
                            dump($date9[0]);
                            $dateReceptionDossier = $date9[2].'-'.$date9[1].'-'.$date9[0];
                            dump($dateReceptionDossier);
                        }
                        else
                        {
                            $dateReceptionDossier = NULL;   
                        }
                        $entity->setReceptionDossier($dateReceptionDossier);  
    

    问题依然存在……

    传递给 App\Entity\Oasice::setReceptionDossier() 的参数 1 必须实现接口 DateTimeInterface,给定字符串,在第 85 行的 ...\src\Controller\ImportController.php 中调用

    日期终于有了正确的格式,但仍然是字符串...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2011-10-13
      相关资源
      最近更新 更多