如何解决碳::现在显示错误的时间,除非格式化 注意:
我的数据库返回的时间有问题,一切都是过去的 2 小时。
我已经对此问题进行了一段时间的故障排除,并检查了以下内容:
/etc/php.ini 只是在使用 ini 并且有 date.timezone = Europe/Amsterdam
。(也重新启动了 apache)
Laravel 的 app.php 配置有 'timezone' => 'Europe/Amsterdam'
。
我跑了 config:clear
和 config:cache
。
我能够将问题归结为碳。
我有一条只返回 Carbon::now()
的路线,它显示 2021-07-09 10:58:31.874837Z
(提前 2 小时)
如果我将代码修改为 Carbon::now()->format("Y-m-d H:i:s")
,它将返回 2021-07-09 12:58:31
,这是正确的时间。
如果我运行 tinker,然后运行 Carbon/Carbon::now()
它会直接显示正确的时间(在本地 Win 10 和 centos 服务器上)
我不知道为什么 carbon 在格式化时显示不同的时间,我是否错过了某个地方的配置?
提前致谢。
注意:
如果我使用修补程序,我会从我的数据库(时区是 CEST)和 Carbon::now()
解决方法
你打开
我的数据库返回的时间有问题,一切都是过去的 2 小时。
您的数据库可能是这里的关键:存储在那里的数据是否带有时区?它是在特定时区预期的吗?数据库可能会返回 UTC,这与夏季的 CET(阿姆斯特丹时间)相差 2 小时。您的应用程序将此时间解释为 CET。因此,时间落后了2h
我的建议是不要在技术层的任何地方使用时区,只在 UI 中格式化为用户的时区。例如。让您的所有服务器仅在 UTC 上运行。以 UTC 存储时间。用UTC计算你需要的任何东西。对于显示,转换为当前用户的首选时区。
该建议可能正是您遇到的问题:您的数据库仅存储 UTC 时间,您将其解释为 CET。不要那样做。这将导致今年秋季夏令时的下一次更改变得一团糟。
添加:
即使(或特别是)在你的笔记之后,我仍然坚持我上面写的:所有你的技术基础设施纯粹在 UTC 上工作,总是 em>。这意味着永远不会有任何转换,直到最后一刻,当时间转换为用户的首选时区。或者如果有,找到罪魁祸首是微不足道的。当您在所有操作中经常涉及时区数学时(除了到/从 UTC 转换),所有的地狱都失败了。尤其是夏令时前后的变化(发生在不同地区的不同日期,以及两个半球的不同方向)
,我有一条路线,它只返回 Carbon::now() 并显示 2021-07-09 10:58:31(提前 2 小时)
如果我将代码修改为 Carbon::now()->format("Y-m-d H:i:s") 它将返回 2021-07-09 12:58:31,这是正确的时间。
第一句中的“显示”是什么,因为对象的时区或值不可能与您使用 format("Y-m-d H:i:s")
进行格式化时看到的不同
2021-07-09 10:58:31
这里是日期时间转换为 UTC 的结果。
所以我的猜测是你在谈论一个 JSON 输出,你看到的实际上是 2021-07-09T10:58:31Z
而不是 2021-07-09 10:58:31
,在这种情况下它是正确的,这里的 Z
是保留非常重要,因为它意味着“祖鲁语 = GMT”,并允许 JSON 阅读器(例如网络浏览器)在地球上的任何地方构建正确的日期,而如果 2021-07-09 12:58:31
将被返回,阅读器将没有知道它是哪个时区。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。