如何将Laravel输出的日期格式更改为JSON?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将Laravel输出的日期格式更改为JSON?相关的知识,希望对你有一定的参考价值。
我已经在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}}]}]
我知道这是一个老问题,但仍然没有很好的答案。更改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;
...
}
我强烈建议您使用Carbon类来处理所有日期和日期时间变量,它已经与Laravel 5一起提供,因此您可以随时开始使用。
在Carbon Repo上查看它,看看你能用它做些什么。
例如,您可以像这样格式化模型中的日期
Carbon::parse($model->created_at)->format('d-m-Y')
至于一个好的方法,我建议使用Repository Pattern以及演示者和变形金刚。通过使用它,您可以定义您希望如何显示/安装json,并选择在您需要时跳过演示者,以便在您进行查询时仍然获得Eloquent模型。
通过将模型的$ dateFormat属性设置为您需要的格式,您可以轻松地将模型序列化为JSON时用于将日期/时间转换为字符串的格式更改,例如:
class MyModel extends Eloquent {
protected $dateFormat = 'Y-m-d';
}
您可以在格式字符串中找到不同占位符的文档:http://php.net/manual/en/datetime.createfromformat.php
在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;
}
显然,如果你使用不同的格式,你可以更恰当地命名这个特性,但重点是你可以使用任何Carbon的常见格式,只需将toIso8601String()
替换为你需要的格式。
以上是关于如何将Laravel输出的日期格式更改为JSON?的主要内容,如果未能解决你的问题,请参考以下文章