Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将日期格式Laravel输出更改为JSON?_Php_Json_Laravel_Laravel 5 - Fatal编程技术网

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

Php 如何将日期格式Laravel输出更改为JSON?,php,json,laravel,laravel-5,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是否是最好的方法,因为它会影响应用程序其他部分中的日期 或者,在将日期格式传递给date

我已经用Laravel构建了一个应用程序,并以这种格式返回了日期:
2015-04-17 00:00:00
。我向JSON发送了一个特定的查询,这样我就可以用D3生成一个图,我想我想要ISO8601(
'1995-12-17T03:24:00'
)中的日期,或者其他一些可以很好地使用javascript Date()构造函数的格式

有没有办法在Laravel端将输出的日期格式更改为JSON?我不确定使用mutator是否是最好的方法,因为它会影响应用程序其他部分中的日期

或者,在将日期格式传递给date()构造函数之前,最好保持JSON输出不变,并使用一些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}}]}]

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

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

您可以在不同的占位符上找到文档,您可以在这里的格式字符串中使用:

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

看看你能用它做些什么

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

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

至于一个好的方法,我建议与演讲者和变形金刚一起使用。通过使用它,您可以定义如何显示/装载json,并选择随时跳过演示者,以便在您进行查询时仍能返回雄辩的模型。

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

    ...
}
扩展一下,我创建了一个特性,它将DateTimeInstance转换为一个实例,这样我就可以轻松地利用它的特性

在我的特殊情况下,我想根据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()
替换为您需要的格式即可。

您可以在D3中以几乎任何格式解析日期。尝试使用变异器和访问器,从laravel doc'sWith
d3
阅读更多关于它的信息,这非常简单:
var format=d3.time.format(“%Y-%m-%dT%H:%m:%S”);var myDate=format.parse('1995-12-17T03:24:00')从第7版开始,was更改。因此,请使用
受保护的$dates=['my_date_field'、'updated_at'、'disabled_at']让您的模型知道哪些字段是日期这将使这些字段在默认情况下返回一个Carbon实例,并在您将其转储到JSON时根据$dateFormat对其进行格式化。我使用的是
受保护的$dates
。我不认为
protected$dateFormat='U'
将对我起作用,因为它看起来会影响数据库的内容。当我尝试使用它时,它似乎也不会影响JSON输出。也许我做错了?我将编辑我的文章以包含代码。它应该可以工作,看看Eloquent模型的类方法serializeDate():这是将模型对象序列化为json时使用的方法。只要确保所有日期字段都包含在$dates属性中它不起作用,它在Carbon.php第425行中给出了一个错误InvalidArgumentException:即使在我包含$dates字段之后,跟踪数据它发生在我身上,你找到解决方法了吗?我正在使用Carbon。我想Laravel没有内置的方法只影响JSON输出?我是一个相当新的开发人员,我觉得存储库模式对我来说可能太复杂了。主要问题是重写
$dateFormat
将对输入和输出都有影响,而问题只涉及格式化输出。为了完成此答案。。。由于方法签名中的DateTime,第一个代码段无法工作。该特性工作正常,但不会返回ISO8601。为此,您可以使用
return$date->format('c)