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

Eri*_*rin 6 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();
}
}
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

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

而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}}]}]
Run Code Online (Sandbox Code Playgroud)

umb*_*rel 13

我知道这是一个老问题,但仍然没有很好的答案.更改protected $dateFormat将影响数据库,而serializeDate()必须覆盖方法

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

或者我自己选择创造特质

trait UnixTimestampSerializable
{
    protected function serializeDate(\DateTimeInterface $date)
    {
        return $date->getTimestamp();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后添加

class SomeClassWithDates extends Model {    
    use UnixTimestampSerializable;

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 同意.主要问题是覆盖`$ dateFormat`会对输入和输出产生影响,而问题只是格式化输出. (2认同)

Rob*_*ton 6

稍微扩展umbrel 的答案,我创建了一个特性,将 DateTimeInstance 转换为Carbon实例,以便我可以轻松使用它的通用格式

在我的特殊情况下,我想根据 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();
    }

}
Run Code Online (Sandbox Code Playgroud)

从这里我可以简单地在相关模型上使用它......

class ApiObject extends Model
{
    use Iso8601Serialization;
}
Run Code Online (Sandbox Code Playgroud)

显然,如果您使用不同的格式,您可以更恰当地命名特征,但重点是您可以使用任何 Carbon 的常见格式,只需替换toIso8601String()为您需要的格式即可。


jed*_*ylo 1

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

class MyModel extends Eloquent {
  protected $dateFormat = 'Y-m-d';
}
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,让你的模型知道哪些字段是日期,使用 `protected $dates = ['my_date_field', 'updated_at', 'disabled_at'];` 这将使这些字段默认返回一个 Carbon 实例,并根据 $ 格式化它们将它们转储为 JSON 时的 dateFormat。 (4认同)