【问题标题】:Laravel - How to convert date value of value in a cell on imported excel filesLaravel - 如何转换导入的 excel 文件单元格中的日期值
【发布时间】:2023-01-24 23:32:14
【问题描述】:

我尝试创建一个函数,用户可以在其中导入格式化文件,例如 .csv.xlsx。 我使用 Maatwebsite excel 库制作函数。

当我尝试将数据插入数据库时​​,具有今天日期 24/01/2023 值的单元格被转换为 44950

我的导入模型有点像这样

public function model(array $row)
{
    return new Event([
        /**
    * Other attributes and columns
    *
    */
        'date' => $row[1],
    ]);
}

如何将这些值转换为'Y-m-d'

【问题讨论】:

    标签: excel laravel-9 maatwebsite-excel


    【解决方案1】:

    我找到了最好的解决方案,我知道 excel 导入文件发生了什么,但这对我有帮助。

    use PhpOfficePhpSpreadsheetSharedDate;
    
    public function model(array $row)
    {
        return new Event([
            /**
        * Other attributes and columns
        *
        */
            'date' => Date::excelToDateTimeObject($row[1]),
        ]);
    }
    

    来源:https://github.com/SpartnerNL/Laravel-Excel/issues/1978

    【讨论】:

      【解决方案2】:

      以下是处理此问题的几个选项:

      您可以添加一个 try-catch 块来处理当日期值格式不正确时抛出的异常。

      use CarbonCarbon;
      
      public function model(array $row)
      {
          try {
              $date = Carbon::createFromFormat('d/m/Y', $row[1])->toDateString();
          } catch (Exception $e) {
              // code to handle the exception, such as logging the error
          }
      
          return new Event([
              /**
          * Other attributes and columns
          *
          */
              'date' => $date,
          ]);
      }
      

      在将日期值传递给 Carbon 方法之前,您可以检查日期值的格式是否正确。

      use CarbonCarbon;
      
      public function model(array $row)
      {
          $date = null;
          $date_regex = '/^(0?[1-9]|[12][0-9]|3[01])[/](0?[1-9]|1[012])[/](19|20)dd$/';
          if(preg_match($date_regex, $row[1]) === 1) {
              $date = Carbon::createFromFormat('d/m/Y', $row[1])->toDateString();
          }
          return new Event([
              /**
          * Other attributes and columns
          *
          */
              'date' => $date,
          ]);
      }
      

      它将检查日期格式是否与正则表达式中给定的格式匹配。如果它匹配,那么它将继续解析日期,否则它不会解析日期。

      同样需要注意的是,你应该检查excel表中日期的格式,并相应地调整createFromFormat()方法中的格式。

      【讨论】:

      • 我前段时间也这样做过,还是解决不了。谢谢你的帮助。
      • 哦,是的,仅供参考,这些方法将出现另一个错误“找不到分隔符号”。
      • 再次检查答案,让我知道它是否有效 :)
      【解决方案3】:

      您可以使用 Carbon 库的 createFromFormat() 方法将日期转换为所需的格式。这是一个示例,说明如何修改 model() 函数来执行此操作:

      public function model(array $row) {
      return new Event([
          /**
          * Other attributes and columns
          *
          */
          'date' => Carbon::createFromFormat('d/m/Y', $row[1])->format('Y-m-d'),
      ]); }
      

      在此示例中,Carbon::createFromFormat('d/m/Y', $row[1]) 将从日期创建一个 Carbon 实例,格式为“d/m/Y”(例如“24/01/2023”) ).然后,->format('Y-m-d') 会将 Carbon 实例转换为格式“Y-m-d”(例如“2023-01-24”)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 1970-01-01
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多