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

Posted

技术标签:

【中文标题】如何将 Laravel 输出的日期格式更改为 JSON?【英文标题】:How do I change the date format Laravel outputs to JSON? 【发布时间】:2016-03-08 13:27:03 【问题描述】:

我在 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]]

【问题讨论】:

您可以在 D3 中以几乎任何格式解析日期。 尝试使用 mutators 和 accessors,从 laravel doc 中了解更多信息 使用d3 就像:var format = d3.time.format('%Y-%m-%dT%H:%M:%S'); var myDate = format.parse('1995-12-17T03:24:00'); 从第 7 版开始,laravel default date serialization format 已更改 【参考方案1】:

稍微扩展umbrel's answer 我创建了一个特征,将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() 替换为您需要的格式。

【讨论】:

【参考方案2】:

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

    ...

【讨论】:

同意。主要问题是覆盖$dateFormat 将对输入和输出产生影响,而问题只是关于格式化输出。 只是为了使这个答案完整......由于方法签名中的 DateTime ,第一个 sn-p 不起作用。该特征完美运行,但不会返回 ISO8601。为此,您可以使用return $date->format('c);【参考方案3】:

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

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

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

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

至于好的方法,我建议将Repository Pattern 与 Presenters 和 Transformers 一起使用。通过使用它,您可以定义您希望如何显示/安装您的 json,并选择在任何时候跳过演示者,以便在您进行查询时仍然返回 Eloquent 模型。

【讨论】:

我正在使用碳。我想 Laravel 没有办法只影响 JSON 输出?我是一个相当新的开发人员,我觉得存储库模式对我来说可能太复杂了。【参考方案4】:

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

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

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

【讨论】:

另外,使用protected $dates = ['my_date_field', 'updated_at', 'disabled_at']; 让您的模型知道哪些字段是日期,这将使这些字段默认返回一个 Carbon 实例,并在您将它们转储到 JSON 时根据 $dateFormat 对其进行格式化。 我正在使用protected $dates。我不认为protected $dateFormat ='U'; 对我有用,因为它看起来会影响到数据库的内容。当我尝试它时,它似乎也不会影响 JSON 输出。也许我做错了?我将编辑我的帖子以包含代码。 它应该可以工作,看看 Eloquent 模型的类方法 serializeDate():github.com/illuminate/database/blob/5.1/Eloquent/… 这是将模型对象序列化为 json 时使用的方法。只需确保所有日期字段都包含在 $dates 属性中 它不起作用,它在 Carbon.php 第 425 行中给出了一个错误 InvalidArgumentException:即使我包含了 $dates 字段,也出现了尾随数据 发生在我身上,你找到解决的方法了吗?

以上是关于如何将 Laravel 输出的日期格式更改为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

使用时刻 js 将 mysql 日期中的组 concat 更改为印度尼西亚日期格式

如何更改 django 日期时间格式输出?

更改默认日期格式 laravel sql 查询

将日期更改为字符串格式

用的是jquery.datePicker.js 如何将日期格式改为yyyy-mm-dd

将格式输入 type='date' 从 mm-dd-yyyy 更改为 dd-mm-yyyy Laravel [重复]