猿问

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

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

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

我们 MySQL 数据库中的所有DateTimetimestamps字段也存储在Europe/London时区中。

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

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

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

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

使用上面的代码示例,任务将提前一个小时到期,因为UTC晚了一个小时BST

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

  1. 是否有任何资源概述了将系统从本地时区转换为 UTC 的方法?

  2. UTC我应该将所有内容都存储起来,Europe/London然后在前端为用户转换,而不是转换为吗?

  3. 有什么方法可以轻松查询其中包含多个时区的数据库表?

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


交互式爱情
浏览 214回答 1
1回答

侃侃无极

不能说你列表中的第一项,这是我对第二项的看法。实际上有很多时区你应该知道:默认的 php 时区(来自 php.ini 的那个),服务器时区(afaik,如果 php.ini 时区是空的,它会回落到服务器的那个),mysql 的时区,部署mysql实例的服务器时区,你当前所在的时区,你用户的时区,更不用说像mysql连接时区这样通俗的东西了。话虽如此,如果您不想在调试花哨的错误时度过一段愉快的时光,那么您希望所有系统时区都相同。实际上,它到底是什么并不重要。更重要的是,您了解它们中的每一个,并且知道它们如何适用于您的情况。将所有系统时区设置为 UTC 只是更可预测、更通用、更常见。但如果我是你,我会保留基础设施时区设置不变。我怀疑你从这一举措中获得了什么有形的东西。在前端转换日期时间实际上是处理此类问题的常用方法。例如,在 postgres 中,可以将时区与日期时间一起保存,但它几乎没有用,因为它已转换为系统时区。所以当我需要向客户端输出日期时间时,我会写类似(new AdjustedAccordingToTimeZone(    new FromISO8601('2018-04-25 15:08:01+00:00'),    new Moscow()))    ->value();关于你的第三个问题,如果您查询多行,每一行都有自己的时区,您可以随时将这些日期转换为您希望的任何时区。
随时随地看视频慕课网APP
我要回答