MySQL在使用时区时应使用哪种数据类型存储DateTime?

我有一个发布职位的应用程序。用户可以选择工作上线和到期的开始和结束日期/时间。

发布职位的用户可以在任何国家/地区,但是大多数情况下,他们的职位都将在英国,因此他们选择的开始和结束日期将在当地时间,但是暂时简化了申请工作。表示所有时间均为“欧洲/伦敦”时区,但我想保持范围,以便日后真正实现该应用程序的国际化。

请注意,我还将用户timzezone存储在数据库列中,但是如上所述,当显示日期时,他们暂时都将被本地化为“欧洲/伦敦”。

  1. 问题是,在保存到数据库之前,我是否将这些日期转换为UTC?什么是在mysql中存储这些日期/时间的最佳数据类型?日期时间还是时间戳?

  2. 我已经阅读了许多有关使用时间戳的限制的文章,例如在内部将时间戳转换为UTC和2038问题。由于我是在保存之前在应用程序层中将日期转换为UTC,因此使用时间戳字段是有任何意义的,因为它将双重处理此转换...不,如果我错了或没关系,请纠正我,如果它在时间戳字段中以UTC的形式出现,会在时间戳字段中以UTC的形式出现吗?

  3. 在执行搜索(例如,如下所示)以返回所有实时工作时,我现在是否需要将该查询中的所有日期转换为时区“欧洲/伦敦”

例如来自:

SELECT jobs.*,TIMESTAMPDIFF(DAY,NOW(),jobs.end_dt) as days_remaining
FROM jobs
WHERE jobs.start_dt <= NOW() and jobs.end_dt >= NOW() 

收件人:

 SELECT jobs.*,CONVERT_TZ(now(),'UTC','Europe/London'),CONVERT_TZ(jobs.end_dt,'Europe/London')) as days_remaining
 FROM jobs
 WHERE CONVERT_TZ(jobs.start_dt,'Europe/London') <= CONVERT_TZ(now(),'Europe/London') and CONVERT_TZ(jobs.end_dt,'Europe/London') >= CONVERT_TZ(now(),'Europe/London')

如果使用时间戳作为数据类型,那么我们需要知道mysql的当前时区设置为什么。 MySQL将TIMESTAMP值从当前时区转换为UTC进行存储,然后从UTC返回当前时区进行检索。 (对于其他类型,例如DATETIME,不会发生这种情况)。默认情况下,每个连接的当前时区是服务器的时间。因此,也许我们需要按如下所示设置laravel mysql连接配置,以确保不会得到任何时髦的结果:

 <?php
    // in config/app.php

    'timezone' => 'UTC',// AND in config/database.php

   'connections' => [

    'mysql' => [
        //....
       'timezone'  => '+00:00',// set to UTC
   ],

有任何建议和考虑,提示和技巧吗?

yiling3716416 回答:MySQL在使用时区时应使用哪种数据类型存储DateTime?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3111273.html

大家都在问