我的应用程序时区设置为“美国/蒙特利尔”。
我有两个日期时间字段“开始”和“结束”,每个都使用Laravel $casts属性转换为日期时间:
protected $casts = [
'start' => 'datetime',
'end' => 'datetime'
];
当我使用以下数据创建我的模型实例时:
MyModel::create(
[
'start' => "2022-02-08T20:45:58.000Z", // UTC time
'end' => "2022-02-08T20:45:58.000Z",
]
);
创建的模型保持相同的时间(20:45),但时区设置为美国/蒙特利尔。
App\MyModel {#4799
id: 44,
created_at: "2022-02-08 15:49:02",
updated_at: "2022-02-08 15:49:02",
start: 2022-02-08 20:45:58,
end: 2022-02-08 20:45:58,
}
当我访问开始和结束属性时,我得到的时间相同,但是带有美国/蒙特利尔的时区,如下所示:
// accessing 'start' attribute of the instance I just created
Illuminate\Support\Carbon @1644371158 {#4708
date: 2022-02-08 20:45:58.0 America/Montreal (-05:00),
我发现使其正常工作的唯一方法是在保存之前手动设置时区:
MyModel::create(
[
'start' => Carbon::parse("2022-02-08T20:45:58.000Z")->setTimeZone(config('app.timezone')),,
'end' => Carbon::parse("2022-02-08T20:45:58.000Z")->setTimeZone(config('app.timezone')),,
]
);
我认为这种方法有点重复了,仅设置应用程序的时区不就足够了吗?有更好的方法吗?我知道应该将应用程序的时区设置为UTC(通常是我的做法),但是这个项目已经用这个时区存储了大量数据,我不确定如何进行转换。
谢谢。
protected $dateFormat = 'U';
吗?它来自于日期转换部分下的同一文档页面,虽然我自己没有尝试过,但似乎是你需要的。 - Abdul Rehman$casts
中的 datetime 的目的是,您可以传递DateTime
或Carbon
对象,而不是字符串。另外,为什么您说“时区设置为 America/Montreal”,而您明显显示的日期是“2022-02-08 20:45:58.0 +00:00”? - miken32