Laravel:转换为 JSON 时更改模型中碳日期的格式

Laravel: Change format of Carbon dates in models when converted to JSON

目前,当我将模型转换为 JSON 时,所有 Carbon 日期字段都像这样转换:

"end_time": {
    "date": "2017-02-03 23:59:00.000000",
    "timezone_type": 3,
    "timezone": "Europe/London"
}

我希望使用 Atom 表示法进行转换。 这可以像这样在碳中完成:

$order->end_time->toAtomString()

其中 $dateCarbon 日期。

如何让模型在将日期转换为原子格式时转换为 JSON?

我知道可以像这样附加数据:https://laravel.com/docs/5.3/eloquent-serialization#appending-values-to-json

但这不会更改现有值的格式?

只要您愿意使用不同于 "end_time" 的名称,您提供的 link 应该是适合您的解决方案。您可以附加 "end_time_formatted" 或类似内容。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Event extends Model
{

    protected $appends = ['end_time_formatted'];

    public function getEndTimeFormattedAttribute()
    {
        return $this->end_time->toAtomString();
    }
}

然后,任何时候您将模型投射到 json,它都会包含 "end_time_formatted"。

您的另一个选择(如果您需要保留相同的名称)是通过将 toJson 方法复制到您的模型中来覆盖它。我可能会建议不要这样做,但这样可以避免每次在将其转换为 JSON.

之前都说 $this->created_at = $this->created_at->toAtomString()
/**
     * Convert the model instance to JSON.
     *
     * @param  int  $options
     * @return string
     *
     * @throws \Illuminate\Database\Eloquent\JsonEncodingException
     */
    public function toJson($options = 0)
    {
        $atom = $this->created_at->toAtomString();
        $json = json_encode($this->jsonSerialize(), $options);

        if (JSON_ERROR_NONE !== json_last_error()) {
            throw JsonEncodingException::forModel($this, json_last_error_msg());
        }
        $json = json_decode($json);
        $json->created_at = $atom;
        $json = json_encode($json);

        return $json;
    }

我无法通过更改方法顶部的值来使其工作,所以我被迫 json_decode,然后 re-encode,感觉不对对我很好。如果您确实使用这条路线,我建议您深入挖掘一下,尝试让它在不需要解码的情况下工作。

另一种方法是格式化您从模型

收到的日期

您可以使用辅助方法将您的日期对象转换为您希望使用 carbon 的格式。

Carbon 有助于格式化能力,我觉得这就是您要找的东西:

your_function_name($created_at_date, $format = "jS M Y") 
 {
    $carbon = new \Carbon\Carbon($created_at_date);
    $formatted_date = $carbon->format($format);

    return $formatted_date;
  }

希望对您有所帮助。

冒着复活僵尸的风险,我将提出一个替代方案来解决这个问题:

重写特征 HasAttributes:

定义的 serializeDate 方法
/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->toAtomString();
}