簡體   English   中英

Laravel Carbon日期兩個日期之間的差異

[英]Laravel Carbon Date Difference between two dates

我的數據庫中有一個字段,它有一個使用時刻js的時間戳。 結果是這樣的。

["2018-02-11 11:30:17","2018-02-11 11:20:17","2018-02-11 11:10:17"]

但是當我從db返回created_at colum時,數組給出如下:

[{"date":"2018-02-11 11:40:17.000000","timezone_type":3,"timezone":"Asia\/Karachi"},{"date":"2018-02-11 11:40:31.000000","timezone_type":3,"timezone":"Asia\/Karachi"},{"date":"2018-02-11 11:40:40.000000","timezone_type":3,"timezone":"Asia\/Karachi"}]

那么我怎樣才能以碳可以理解的格式獲取兩個列日期? 我希望“starttime”列與“created_at”進行比較。 這可以實現嗎? 到目前為止,這是我的代碼:

$cleanStart = Clean::pluck('starttime')->toArray();
$cleanFinish = Clean::pluck('created_at')->toArray();

$from = Carbon::parse($cleanStart);
$to = Carbon::parse($cleanFinish);
$diff_in_hours = $to->diffInHours($from);

return $diff_in_hours; 

但它給了我一個錯誤:

Type error: DateTime::__construct() expects parameter 1 to be string, array given

另外,我如何將陣列賦予碳。

所以最后這是我嘗試的事情:

$cleanCollection = Clean::get(['starttime','created_at']);
        foreach($cleanCollection as $cleanObj){
            $startTime = Carbon::parse($cleanObj->starttime);
            $diff = $cleanObj->created_at->diffInseconds($startTime);
        }


       echo $diff;

但是當我刷新頁面時,值會以秒為單位變化。 如果添加了另一條記錄,它會再次累加。

Pluck將為您提供結果集中所有開始時間的數組,這就是您將數組傳遞給parse 你實際上得到了所有的開始時間和所有創建的ats,然后嘗試有效地比較所有。

你要么得到一個結果,

喜歡

$clean = Clean::first();
$from = Carbon::parse($clean->starttime);
$to = Carbon::parse($clean->created_at);
$diff_in_hours = $to->diffInHours($from);

或者,如果你想要每行,你必須迭代它們並做同樣的事情

Clean::all()->each(function ($clean) {
    $from = Carbon::parse($clean->starttime);
    $to = Carbon::parse($clean->created_at);
    $diff_in_hours = $to->diffInHours($from); // for this row
});

您可以做的另一件事是在Clean模型上放置一個訪問器來幫助您解決這個問題

public function getDiffInHoursAttribute()
{
    $from = Carbon::parse($this->starttime);
    $to = Carbon::parse($this->created_at);
    return $to->diffInHours($from);
}

然后

echo Clean::first()->diffInHours;

要么

foreach(Clean::all() as $clean) {
    echo $clean->diffInHours;
}

此外,如果您將以下內容添加到模型中,Eloquent將自動將字符串解析為Carbon對象,以便您可以在代碼中跳過對Carbon :: parse()的需求

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = [
    'starttime'
];

嘗試將protected $dates添加到Clean模型中,如下所示:

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = [
    'created_at',
    'updated_at'
];

正如您可以從代碼中的注釋中讀取的那樣,將所有應轉換為日期的列放入其中,這將有助於您更輕松地實現日期操作。

編輯1:

$start = new Carbon($cleanStart['date'], $cleanStart['timezone']);
$finish = new Carbon($cleanFinish['date'], $cleanFinish['timezone']);

然后你可以像這樣比較:

var_dump($start->eq($finish)); //Is start date same as finish date
var_dump($start->ne($finish)); //Is start date not same as finish date
var_dump($start->gt($finish)); //Is start date greater than finish date
var_dump($start->gte($finish)); //Is start date greater than or equal to finish date
var_dump($start->lt($finish)); //Is start date less than finish date
var_dump($start->lte($finish)); //Is start date less than or equal to finish date

編輯2:

為了使下面的代碼有效,您必須在EDIT 1初始化$start$finish日期

$ago = $start->diffForHumans($finish, true); //2 days OR 3 weeks OR 1 hour

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM