laravel管理时区
起因
很多情况下不同的用户有着不同的时区,那么在laravel中该怎么去管理不同用户之间的时区切换呢。
用UTC来时区管理
可以统一使用UTC时间来管理时区。因为通过UTC(世界协调时间)可以轻易的将时间转换成任意时区的时间,所以laravel中默认设置的时区就是UTC。
那么该如何正确使用UTC时间呢?首先数据库里的时间必须要统一存储成UTC时间,而不能是其他时区的时间。其次在读取数据的时候需要将时间转换成对应用户时区的时间,下面这段代码就是将用户的create_at(UTC)字段转换为用户所在时区(Asia/Shanghai)的时间。
1 | // $user->create_at(2024-07-22 02:31:35),auth()->user()->timezone(Asia/Shanghai) |
那么在解决完时间显示问题之后,该怎么在用户指定了时间的情况下取出对应的时区数据呢?答案是将用户提交的时间的时间转换成UTC时间就行了,然后再通过UTC时间去查询对应的数据。因为数据库中存储的是UTC时间所以需要将提交的时间转换成UTC之后再去查询。下面这段代码会将用户提交的时间转换成UTC时间然后去数据库中查询数据
1 | $requestTime = '2024-07-22 10:31:35';// 请求的时间(Asia/Shanghai) |
这样数据库查询对应时区时间的问题就解决啦。虽然通过时区来转换时间这个问题解决了,但是要怎么获取用户的时区呢?
获取用户时区
可以通过jamesmills/laravel-timezone这个包来设置用户的时区,也可以通过js来获取时区。