时间戳的时区在数据库中是如何工作的 and/or Laravel
how timestamp's timezone works in a database and/or Laravel
我对时间戳的时区有疑问。
如何使用app.php中的时区?我意识到如果我使用 Carbon 创建时间戳或者如果我从数据库中查询值(时间戳),行为会有所不同。
注意:我的 MySQL 使用系统的时区,即 GMT+8 或 Asia/Kuala_Lumpur。
- 示例#1
- 在app.php
中设置时区="UTC"
- 创建 Carbon 实例
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404830 {#3496
date: 2019-10-30 03:07:10.625282 UTC (+00:00),
}
>>>
- 示例#2
- 在app.php
中设置时区="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,这对我来说是意料之中的。您根据时区获得了不同的价值。当我们从数据库查询时间戳时,事情变得有点奇怪(至少对我而言)。
- 示例#3
- 在app.php
中设置时区="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),
}
- 示例#4
- 在app.php
中设置时区="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 数据库驱动程序假设它是作为在应用程序配置中设置的时区编写的。如果您要在项目中期更改时区,这会丢弃所有日期。
我对时区的个人建议是在您的应用程序和服务器上将所有内容都保持为 UTC,然后仅在最后可能的时刻(例如在视图中)根据用户的偏好更改时区。这还允许您输出 UTC 时间戳,并让 JavaScript 将其更新为用户的语言环境。时区非常困难,如果您的国家/地区有夏令时,时区会变得更加混乱,例如 Europe/London
根据年份改变时区。
我对时间戳的时区有疑问。
如何使用app.php中的时区?我意识到如果我使用 Carbon 创建时间戳或者如果我从数据库中查询值(时间戳),行为会有所不同。
注意:我的 MySQL 使用系统的时区,即 GMT+8 或 Asia/Kuala_Lumpur。
- 示例#1
- 在app.php 中设置时区="UTC"
- 创建 Carbon 实例
>>> new Carbon\Carbon;
=> Carbon\Carbon @1572404830 {#3496
date: 2019-10-30 03:07:10.625282 UTC (+00:00),
}
>>>
- 示例#2
- 在app.php 中设置时区="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,这对我来说是意料之中的。您根据时区获得了不同的价值。当我们从数据库查询时间戳时,事情变得有点奇怪(至少对我而言)。
- 示例#3
- 在app.php 中设置时区="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),
}
- 示例#4
- 在app.php 中设置时区="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 数据库驱动程序假设它是作为在应用程序配置中设置的时区编写的。如果您要在项目中期更改时区,这会丢弃所有日期。
我对时区的个人建议是在您的应用程序和服务器上将所有内容都保持为 UTC,然后仅在最后可能的时刻(例如在视图中)根据用户的偏好更改时区。这还允许您输出 UTC 时间戳,并让 JavaScript 将其更新为用户的语言环境。时区非常困难,如果您的国家/地区有夏令时,时区会变得更加混乱,例如 Europe/London
根据年份改变时区。