首先允许本人来段相声,遥想当年去美帝做项目,上海无法直达达拉斯,于是在棒子国转机。转机是第二天上午11点的飞机,早早到了机场checkin后,发现登机口人太多,就去了旁边的登机口看起了Naruto,看着看着发现已经10点出头了,于是我想着就去登机了,结果你懂的。由于手机时区没调,其实这时的棒子国已经11点多了,后面的一趴泪就不说了。。。
由于地球是圆的,时区的存在会让我们程序处理起来很麻烦。接下来浅谈下在,php、mysql、vue技术栈下的如何更好的存储和传输时间。
用时间戳存储传输
以前一直用时间戳存储和传输,mysql里存10位的int型,php用time(),vue用moment处理。
- 优点:时间戳到哪都一样,去了棒子国也是这个值
- 缺点:没啥致命的,无非是个10位还是13位的问题,代码处理下基本能用
用timestamp存储传输
由于最近开始用laravel写项目,发现框架默认的create_time是用timestamp,并且用Carbon来进行的时间处理。于是研究了下。发现其实mysql的timestamp存储和前端控件及Date函数对timestamp的处理还是很方便的。唯一麻烦的是前端如果传给php的是timestamp的话,php端的处理需要注意,比如:
$date_from_js = '2020-03-26T07:00:00.000Z'; // 从前端传来的时间
// 非Carbon处理方式
date_default_timezone_set('Asia/Shanghai'); // 这句很重要,说明时区,当然你的框架可能已经给你设定好了
$date_from_js_int = strtotime($date_from_js);
$date_without_carbon = date("Y-m-d H:i:s",$date_from_js_int);
// Carbon处理方式
$date_from_js_parse = Carbon::parse($date_from_js,'UTC'); // 这里必须是UTC
$date_from_js_parse->setTimezone('Asia/Shanghai'); // 而这里才是你想要用的时区
$date_with_carbon = $date_from_js_parse->toDateTimeString();
以下是具体的值
下面说下优缺点:
- 优点:貌似框架,基类都支持的比较好,其实弄懂了时区的概念,确实也没啥麻烦的。不用像时间戳转来转去。
- 缺点:timestamp有个2038年的问题,这个。。管它呢
接下来我会继续用timestamp来存储和传输,目前来说在前端的显示,后端的存储,时间的比较搜索方面都没啥问题。欢迎有问题的朋友一起探讨。