【问题标题】:Converting a carbon date to mysql timestamp.将碳日期转换为 mysql 时间戳。
【发布时间】:2015-08-26 07:10:45
【问题描述】:

我在 mysql 数据库中有一个时间戳变量列。试图将碳时间戳转换为我可以在那里输入的东西,但Carbon::now() 只返回一个碳对象,当我尝试使用碳对象的时间戳字符串时,它不会在 mysql 中注册。

public function store(CreateArticleRequest $request){
        $input = $request->all(); 
        var_dump($input); // JUST SO YOU CAN SEE
        $input['published_at'] = Carbon::now(); 
        var_dump($input); // JUST SO YOU CAN SEE
        Article::create($input);   
}

我的第一个 var 转储是这样的:

array (size=4)
  '_token' => string 'Wy67a4hWxrnfiGz61wmXfYCSjAdldv26wOJiLWNc' (length=40)
  'title' => string 'ASDFasdf' (length=8)
  'body' => string 'asdfasdf' (length=8)
  'published_at' => string '2015-08-26' (length=10)  

我的第二个 var 转储是这样的。

与“published_at”相关的 mysql 列是一个时间戳变量。我想如何将其从碳对象转换?

提前致谢。

【问题讨论】:

  • 在日期使用strtotime

标签: php mysql laravel timestamp php-carbon


【解决方案1】:

简而言之,toDateTimeString() 就是您要查找的内容:

$input['published_at'] = Carbon::now()->toDateTimeString();

请参阅http://carbon.nesbot.com/docs/ 了解更多选项,包括toDateString(),如果您只需要日期部分而不是时间。

但更好的处理方法是让 Laravel 为您处理向 Carbon 对象转换日期值/从 Carbon 对象转换日期值。见https://laravel.com/docs/5.4/eloquent-mutators#date-mutators

【讨论】:

    【解决方案2】:

    问题出在你的日期字符串中,例如,你有这个:

    public function setCrbDateAttribute($value)
    {
         $this->attributes['crb_date'] = \Carbon\Carbon::createFromFormat('d-m-Y h:i', $value);
    }
    

    现在,如果有像 2014 年 10 月 12 日这样的日期,则会出现此错误,因为缺少小时和分钟。因此,您要确保日期包含所有 pars,并确保日期字符串包含 - 作为分隔符而不是 /。

    换句话说,在使用 Carbon 之前检查 $value 并确保您的日期字符串包含与您在方法中使用的格式完全相同的字符串。

    这也发生在访问器方法中,所以在Carbon::createFromFormat().中使用之前先检查日期值

    如果您从用户输入中获取日期,则在使用日期或 date_format:format 规则之前验证日期,请在此处检查验证。

    答案参考:

    Laravel/Carbon Timestamp 0000-00-00 00:00:00 or Unexpected data found. Unexpected data found. Data missing

    【讨论】:

      【解决方案3】:

      您还可以在模型上设置 Mutator。

      public function setPublishedAt($value)
      {
          $this->attributes['published_at'] = strtotime($value);
      }
      

      转换为时间戳

      $model -> setPublishedAt('2015-08-26'); // 1440572400
      

      或者您可以使用 strtotime 将日期转换为时间戳

      strtotime — 将任何英文文本日期时间描述解析为 Unix 时间戳

      希望对您有所帮助。

      【讨论】:

      • 那不是 MySQL 时间戳,那是 UNIX 时间戳
      • 你真的需要更新这个问题的答案
      猜你喜欢
      • 2023-03-24
      • 2013-09-27
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多