程序中的时间问题

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

缘由:
前不久,一个做前端的同事联系我,他说一个时间控件接收到后端的数据后,显示时总是少了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都用不好,还有什么理由说那些高级东西呢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值