繁体   English   中英

处理将现有 laravel 应用程序从本地时区转换为 UTC 的最佳方法

[英]Best way to handle converting existing laravel application from local timezone to UTC

目前,在我们的 Laravel 应用程序中,我们的时区设置如下。

 'timezone' => env('TIMEZONE', 'Europe/London'),

MySQL 数据库中的所有DateTime时间和timestamps字段也存储在Europe/London时区。

我们的应用程序现在将切换到UTC ,但是由于BST目前是一个小时,如果我们在我们的应用程序中将TIMEZONE更改为UTC ,所有现有的基础设施都会中断。

会中断的事情包括我们现有的使用时间字段的查询,因为它们与数据库中的记录不同步一个小时。

我们在查询中使用系统中时间的示例如下

Task::where('expired', '=', false)->where('expires_at', '<', Carbon::now())->get();

对于上面的代码示例,任务将提前一小时过期,因为UTCBST晚一小时。

由于更改为UTC将是一个系统的根本变化,我希望我能得到以下问题的答案。

  1. 是否有任何资源概述了将系统从本地时区转换为 UTC 的方法?
  2. 我应该将所有内容存储在Europe/London ,然后在前端为用户转换,而不是转换为UTC
  3. 有什么方法可以轻松查询包含多个时区的数据库表?

感谢您的帮助,我知道这个问题很困难,所以任何能指出我正确方向的东西都将不胜感激。

不能说你列表中的第一项,这是我对第二项的看法。 There are actually quite a few timezones you should be aware of: default php timezone (the one from php.ini), server timezone (afaik, if php.ini timezone is empty, it falls back to the one from a server), mysql's时区,部署 mysql 实例的服务器时区,您当前所在的时区,您的用户的时区,更不用说诸如 mysql 连接时区之类的公开内容。

话虽如此,如果您不想花时间调试花哨的错误,那么您希望所有系统时区都相同。 实际上,它到底是什么并不重要。 更重要的是,您了解它们中的每一个,并知道它们如何适用于您的情况。 将所有系统时区设置为 UTC 只是更可预测、更通用、更常见。

但如果我是你,我会保持基础设施时区设置不变。 我怀疑你会从这一举动中获得任何切实的好处。 在前端转换日期时间实际上是处理此类事情的常用方法。 例如,在 postgres 中,可以将时区与日期时间一起保存,但它几乎没有用,因为它已转换为系统时区。 因此,当我需要 output 给客户一个日期时间时,我会写类似

(new AdjustedAccordingToTimeZone(
    new FromISO8601('2018-04-25 15:08:01+00:00'),
    new Moscow()
))
    ->value();

关于你的第三个问题,快速谷歌搜索指出了这个问题 因此,如果您查询多行,每行都有自己的时区,您可以随时将这些日期转换为您希望的任何时区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM