如何将Laravel输出的日期格式更改为JSON?

时间:2015-12-03 19:18:09

标签: php json laravel laravel-5

我在Laravel中构建了一个应用程序,并以这种格式回复了日期: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}}]}]

4 个答案:

答案 0 :(得分:12)

我知道这是一个老问题,但仍然没有很好的答案。 更改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;

    ...
}

答案 1 :(得分:2)

我强烈建议您使用Carbon类来处理所有日期和日期时间变量,它已经与Laravel 5一起提供,因此您可以随时开始使用。

Carbon Repo上查看,了解您可以用它做些什么。

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

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

至于一个好的方法,我建议使用Repository Pattern以及演示者和变形金刚。通过使用它,您可以定义您希望如何显示/装载您的json,并选择在您需要时跳过演示者,以便在您进行查询时仍然获得Eloquent模型。

答案 2 :(得分:1)

通过将模型的 $ dateFormat 属性设置为您需要的格式,您可以轻松地将模型序列化为JSON时用于将日期/时间转换为字符串的格式更改,例如:

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

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

答案 3 :(得分:0)

umbrel's answer上进行一点扩展,我创建了一个特征,该特征将DateTimeInstance转换为Carbon实例,以便可以轻松使用它的common formats

在我的特定情况下,我想根据ISO-8601序列化所有日期。

特征如下...

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;
}

很明显,如果使用其他格式,则可以更适当地命名特征,但要点是,只需将toIso8601String()替换为所需的格式,就可以使用Carbon的任何常见格式。