26

我在 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 列是一个时间戳变量。我想如何将其从碳对象转换?

提前致谢。

4

3 回答 3

69

简短的回答是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

于 2017-03-25T04:52:47.877 回答
12

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

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

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

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

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

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

答案参考:

Laravel/Carbon 时间戳 0000-00-00 00:00:00 或发现意外数据。发现意外数据。数据缺失

于 2015-08-26T07:44:56.350 回答
-26

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

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

转换为时间戳

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

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

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

希望这有帮助。

于 2015-08-26T07:50:39.367 回答