簡體   English   中英

如何將 Laravel 輸出的日期格式更改為 JSON?

[英]How do I change the date format Laravel outputs to JSON?

我在 Laravel 中構建了一個應用程序,並且 eloquent 以這種格式返回日期: 2015-04-17 00:00:00 我正在向 JSON 發送一個特定查詢,以便我可以使用 D3 制作圖表,我想我想要 ISO8601 中的日期( '1995-12-17T03:24:00' )或其他與javascript Date() 構造函數。

有沒有辦法在 Laravel 端將日期格式更改為 JSON 輸出? 我不確定使用 mutator 是不是最好的方法,因為它會影響我應用程序其他部分的日期。

還是將 JSON 輸出保持原樣,並在將日期格式傳遞給 Date() 構造函數之前使用一些 javascript 字符串方法來操作日期格式會更好嗎? 哪種方法更有效?

這是我的模型:

class Issue extends Model {



protected $fillable = [
    'client_id',
    'do',
    'issue_advocate',
    'service_number',
    'issue_location',
    'issue_description',
    'level_of_service',
    'outcome',
    'referral_id',
    'file_stale_date',
    'date_closed',
    'issue_note',
    'staff_hours'
];

protected $dates = [
    'do',
    'date_closed',
    'file_stale_date'
];

public function setDoAttribute($value)
{
    $this->attributes['do'] = Carbon::createFromFormat('F j, Y', $value)->toDateString();
}
}

這是我的查詢:

$issues = Issue::with('issuetypes')
->select(['do','level_of_service','outcome','id'])
->whereBetween('do',[$lastyear,$now])
->get()->toJson();

我回來的 JSON:

[{"do":"2014-12-23 00:00:00","level_of_service":1,"outcome":1,"id":18995,"issuetypes":[{"id":9,"issuetype":"Non Liberty","pivot":{"issue_id":18995,"issuetype_id":9}}]}]

我知道這是一個老問題,但仍然沒有很好的答案。 更改protected $dateFormat將影響數據庫,而必須重寫方法serializeDate()

class MyModel extends Eloquent {
    protected function serializeDate(\DateTimeInterface $date) {
        return $date->getTimestamp();
    }
}

或者我自己我選擇創造特質

trait UnixTimestampSerializable
{
    protected function serializeDate(\DateTimeInterface $date)
    {
        return $date->getTimestamp();
    }
}

然后添加

class SomeClassWithDates extends Model {    
    use UnixTimestampSerializable;

    ...
}

稍微擴展umbrel 的答案,我創建了一個特征,將 DateTimeInstance 轉換為Carbon實例,以便我可以輕松地使用它的common formats

在我的特殊情況下,我想根據 ISO-8601 序列化所有日期。

性狀如下...

use DateTimeInterface;
use Carbon\Carbon;

trait Iso8601Serialization
{
    /**
     * Prepare a date for array / JSON serialization.
     *
     * @param  \DateTimeInterface  $date
     * @return string
     */
    protected function serializeDate(DateTimeInterface $date)
    {
        return Carbon::instance($date)->toIso8601String();
    }

}

從這里我可以簡單地在相關模型上使用它......

class ApiObject extends Model
{
    use Iso8601Serialization;
}

顯然,如果您使用不同的格式,您可以更恰當地命名特征,但重點是您可以使用 Carbon 的任何常見格式,只需將toIso8601String()替換為您需要的格式。

我強烈建議您使用 Carbon 類來處理所有日期和日期時間變量,它已經隨 Laravel 5 一起提供,因此您可以隨時開始使用。

Carbon Repo上查看它,看看你能用它做什么。

例如,您可以像這樣格式化模型中的日期

Carbon::parse($model->created_at)->format('d-m-Y')

至於一個好的方法,我建議將存儲庫模式與 Presenters 和 Transformers 一起使用。 通過使用它,您可以定義您希望如何顯示/安裝您的 json,並選擇在您想要時跳過演示者,以便在您進行查詢時仍然讓您返回 Eloquent 模型。

通過將模型的$dateFormat屬性設置為您需要的格式,您可以輕松更改用於將模型序列化為 JSON 時將日期/時間轉換為字符串的格式,例如:

class MyModel extends Eloquent {
  protected $dateFormat = 'Y-m-d';
}

您可以在此處的格式字符串中找到有關不同占位符的文檔:http: //php.net/manual/en/datetime.createfromformat.php

如果您使用通常的技術作為

protected $dateFormat = 'Y-m-d';

或者

protected function serializeDate(DateTimeInterface $date) { ... }

或者

protected $casts = [ "myDate" => "date:Y-m-d" ];

它僅在 laravel 將自己的對象序列化時才有效。 無論如何,您都會將這些代碼放在所有模型中,用於所有屬性。

所以我的解決方案,你必須(也)最后把這段代碼放在所有日期屬性的所有模型中,它適用於所有情況:

public function getMyDateAttribute()
{
    return substr($this->attributes['my_date'], 0, 10);
}

在任何模型中使用此功能

protected function serializeDate(DateTimeInterface $date){
    return $date->format('Y-m-d h:i:s');
}

結果

在此處輸入圖像描述

暫無
暫無

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

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