你们在Api开发中是怎么运用日期时间字段的,现在最新版的时间改成默认UTC了
方法一
我知道有人会说
protected $casts = [
‘published_at’ => ‘datetime:Y-m-d H: i:s’
];
但是这样会有一个问题就是,这样虽然解决了,但是就失去了多时区的特性了
方法二
如果还是保留原本的UTC时间输出,这样不同地区可以格式化成不同的时区显示
但是这样也有一个问题
Laravel默认竟然没有一个简单的办法把UTC时间转换成Laravel config/app中配置的时区入库
也就是说我需要自己
Carbon::parse($data[‘published_at’])->timezone(‘Asia/Shanghai’)
每一个需要日期的地方去这样去做一下,很麻烦,你们有啥好办法解决统一的$request数据处理
方法三
保留默认的UTC时间Api输出,同时把App中的时区改成UTC,这样就不用单独处理时间格式转换,但是这样有一个问题就是,数据库里面的日期保存的全是UTC时间了这个缺点了(数据库要不要配置一下?)
用 pgsql 的 datetimeTz 方法
这个功能Mysql不支持是吗,我有试了一下,好像也是没用,我一直在怀疑是自己用错了
config/app.php
中有个配置项,叫做timezone
。我一般都会改成Asia/Shanghai
。你是不是这个没改过。
api接口当然是返回时间戳了,app自己转换
你的问题根本就不是技术问题,建议你自己封装方法,或者封装个laravel包。
看你说的,猜测你应该是要根据请求中的参数判断该用哪个时区。可以在中间件中处理一下,设置全局的时区
像这样,根据请求的参数,动态修改时区
看我标黄的一句,我当时第一次做多海外项目的时候,我也很纠结多国家时区到底如何互相转换才能显示正确呢。原来我们只要做到所有的都是UTC就可以了,mysql utc(保持默认),php utc(保持默认),我们只返回
2024-01-31T15:17:11.000000Z
这种格式就可以了,又显示端自行用设备的时区处理成设备的时区时间格式,js 使用浏览器的时区,app 使用手机时区,包括其它设备。你做国内项目也是一样的道理后端从不管时区,后段只有UTC一个时区,只在前端处理时区问题总结
就是PHP默认为UTC,mysql 也为默认UTC,PHP永远返回TZ形式:
2024-01-31T15:17:11.000000Z
,只在显示端处理时区,设备是什么时区自然会转换为设备时区。反理如果需要前端传日期,也是需要传入2024-01-31T15:17:11.000Z
这种格式,js 可以使用new Date().toISOString()