【问题标题】:Wrong timezone in Laravel 7 after date serialization日期序列化后 Laravel 7 中的时区错误
【发布时间】:2020-06-24 05:57:10
【问题描述】:

我正在开发一个新的 Laravel 7.1 应用程序(不是升级) 但似乎使用日期序列化会丢失时区。

config/app.php

'timezone' => 'Europe/Zurich',

修补程序示例

>>> \Carbon\Carbon::parse('2020-06-22')->timezone
=> Carbon\CarbonTimeZone {#3251
     timezone: Europe/Zurich (+01:00),
   }

Laravel 7 uses toJson()

>>> \Carbon\Carbon::parse('2020-06-22')->toJson()
=> "2020-06-21T22:00:00.000000Z"

所以,当我解析日期时,我没有得到正确的日期。

>>> new \Carbon\Carbon('2020-06-21T22:00:00.000000Z')
=> Carbon\Carbon @1592776800 {#3266
     date: 2020-06-21 22:00:00.0 +00:00,
     timezone: "Z",
   }

>>> (new \Carbon\Carbon('2020-06-21T22:00:00.000000Z'))->format('Y-m-d')
=> "2020-06-21"


目前我正在这样做

$date = Carbon::parse('2020-06-21T22:00:00.000000Z')
    ->setTimezone(config('app.timezone'));

作为替代方案,我可以更改模型中的默认日期格式,如 doc 中所述

/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->toIso8601String(); // 2019-02-01T03:45:27+00:00
}

但我猜Carbon::parse() 和/或new Carbon() 最好默认使用我的时区。-

【问题讨论】:

  • 我看到了同样的问题。

标签: php php-carbon laravel-7


【解决方案1】:

同样的问题。

当从 Laravel 6 -> 7 升级时,这发生了变化。 (见here) 序列化时,时间从本地时间更新为 UTC(根据 ISO-8601)。
但是当将相同的字符串返回给 php 时,Carbon 对象不使用 ISO-8601 时区表示。

问题一:

更新到数据库时,此日期每次都会随着您的时区设置移动。

问题2:

在浏览器中显示时间戳时,此字段的每个表示都必须使用(浏览器)时区设置进行修复。

修复:

升级手册建议fix
我们在所有模型中都使用了一个特征,因此我们在那里进行了更新:

如果您想继续使用以前的行为,您可以覆盖 模型上的 serializeDate 方法:

use DateTimeInterface;

/**
 * Prepare a date for array / JSON serialization.
 *
 * @param  \DateTimeInterface  $date
 * @return string
 */
protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d H:i:s');
}

当然最好对所有事情都使用 UTC,但这需要 JSON (ajax) 的回读将使用与序列化相同的时区设置/差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2012-10-30
    • 2019-03-22
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多