时间戳的时区如何在数据库和/或Laravel中工作

问题描述 投票:0回答:1

我对时间戳的时区有疑问。

如何使用app.php中的时区?我意识到,如果我使用Carbon创建时间戳或从数据库查询值(时间戳),则行为会有所不同。

注意:我的MySQL使用系统的时区是GMT + 8或Asia / Kuala_Lumpur。

  1. 示例1
    • 在app.php中设置timezone =“ UTC”
    • 创建Carbon实例
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404830 {#3496
     date: 2019-10-30 03:07:10.625282 UTC (+00:00),
   }
>>>
  1. 示例#2
    • 在app.php中设置timezone =“ Asia / Kuala_Lumpur”
    • 创建Carbon实例
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404816 {#3520
     date: 2019-10-30 11:06:56.316851 Asia/Kuala_Lumpur (+08:00),
   }

例如#1和#2,这是我的期望。您会根据时区获得不同的价值。当我们从数据库中查询时间戳时,事情变得有些奇怪(至少对我而言)。

  1. 示例#3
    • 在app.php中设置timezone =“ UTC”
    • 从数据库查询
>>> RefCyberCity::whereDataSource('ccms')->take(1)->first()->updated_at
=> Illuminate\Support\Carbon @1572083605 {#3531
     date: 2019-10-26 09:53:25.0 UTC (+00:00),
   }
  1. 示例#4
    • 在app.php中设置timezone =“ Asia / Kuala_Lumpur”
    • 从数据库查询
>>> RefCyberCity::whereDataSource('ccms')->take(1)->first()->updated_at
[!] Aliasing 'RefCyberCity' to 'App\RefCyberCity' for this Tinker session.
=> Illuminate\Support\Carbon @1572054805 {#3491
     date: 2019-10-26 09:53:25.0 Asia/Kuala_Lumpur (+08:00),
   }

我们可以看到两者都输出2019-10-26 09:53:25.0,但是时区不同。

mysql laravel laravel-5 php-carbon
1个回答
0
投票

来自数据库的日期是有效字符串,尽管MySQL具有自己的时区信息,但没有时区的日期字符串不会反映该信息。

Laravel DB驱动程序假设它被编写为应用程序配置中设置的时区。如果您要更改项目的时区中间项目,则将浪费所有日期。

我对时区的个人建议是将所有内容都保留为应用程序和服务器上的UTC,然后仅根据用户的偏好在最后可能的时刻(例如,在视图中)更改时区。这还允许您输出UTC时间戳,并让JavaScript将其更新到用户的语言环境。时区非常困难,如果您所在的国家/地区有夏令时,则时区变得更加混乱,例如Europe/London会根据年份更改时区。

© www.soinside.com 2019 - 2024. All rights reserved.