欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序中的时间问题

程序员文章站 2022-04-29 21:46:24
...

知识的盲区往往会影响到程序编程。对于只有锤子的人来说,所有问题都是钉子。

缘由:
前不久,一个做前端的同事联系我,他说一个时间控件接收到后端的数据后,显示时总是少了8个小时,他想用网上的个工具类,对时间进行加8的运算,以达到理想效果。

我以前,在一大厂里撸代码,发现所有跟时间格式化相关的,都会减8操作后,再格式化,而且注释说明了:转成utc时间(都已经知道UTC时间了,还这样搞)。

计算机的时间其实是一个长整型数,专业一点的术语叫时间戳,不同国家,或者不同地点,对同一时间的表示确不同,我现在的当前时间是:10:17,但在美国可能是12点,但时间戳都是一样的。我曾去*阿里,发现手机上的时间我别人手机相差了几个小时,原来是我设制自动适应时区。
个人pc上也可以手动设置时区:
程序中的时间问题
Linux系统有一个专门的文件存储当前本地化的信息。

有了以上知识,解决方案就有了。

1.在代码中设置时区
在用SimpleDateFormat格式化日期时,用以下构造函数:

  public SimpleDateFormat(String pattern, Locale locale)

Locale 代表了地域信息.
优点:简单易用,在代码中写死,不用管运维怎么设制环境。
缺点:不利于国际化,要重复写代码,且以后不容易改动

2.设置jre运时环境的时区
在启动jar时,跟 上参数 “-Duser.timezone=GMT+8" ,GMT代表的是格林威冶,加8代表了东八区时间。
优点:方便全局设置,方便国际化。
缺点:要修改tomcat或其它中间件的启动参数。(这算个屁,改就改呗)

3.设置系统时区
可以修改Linux系统中的区域文件:/etc/timezone
优点:终极解决方案,一改全部改
缺点:终极解决方案,一改全部改,等等,我有个jar包里面全部用了+8的操作。……

3.根据http协议中自带的信息设置时区
http协议标准中,http 请求头中的Accept-Language 表示语言信息如:

 -H "Accept-Language: zh-CN,zh;q=0.9" ^

配置合spring 中的LocalResolve与i8s可以做到国际化,(当然也包括时间)
优点:实现国际化,什么时候时区由用户浏览器决定。
缺点:实现麻烦

4.docker容器中的方案
docker容器中的时区信息往往与系统的不一致,
方案一: 在制作镜像时替换掉镜像中的/etc/timezone,
方案二:在容器编排时将容器中的/etc/timezone映射成系统的/etc/timezone,

最后:那个前端问题
我查看了那个日期控件的文档,发现有设置区域信息的地方,解决!

我面试过很多人,也被很多人面试过,现在做java似乎都偏向于高层,网上动不动就是掉打阿里p8级架构师的课程。我真的不知道这是好事还是坏事。高并发,中间件等等,了解的人真的很多,有时面试时,就是在背答案,或有时聊源代码,但说到怎么扩展一个框架,就没有人知道了。公司里真的需要这样的程序员,或这样的高级架构角色吗?
如果是我,我宁可看重这些小事。我不信一行简单的代码都写不好,一个简单的算法都不知道,一个jse中的api都用不好,还有什么理由说那些高级东西呢。

相关标签: java spring-cloud