java处理时区的注意事项
来源:互联网 发布:mysql 获取上一年月份 编辑:程序博客网 时间:2024/06/06 09:01
说起Java中的时间,大家或许都很熟悉,朗朗上口的Date、Calendar、SimpleDateFormat等。但是大家对他们的认识真的很深刻吗?今天我要想大家说的是TimeZone,即时区。
经常有人发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone。只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的。
影响TimeZone的因素:
1. 操作系统的时区设置。
2. 数据传输时时区设置。
第一个原因其实是根本原因,当数据在不同操作系统间流转时,就有可能因为操作系统的差异造成时间偏差,而JVM默认情况下获取的就是操作系统的时区设置。因此在项目中最好事先设置好时区,例如:
那么一旦时区设置不同导致时间有偏差怎么办?如何转化呢?
● 用SimpleDateFormat的话,如下:
运行结果:
我们发现同一时间,字符串和日期运行出来的结果并不相同,那么我们应该怎么理解呢?一切都要以当前操作系统的时间为基准。我的操作系统是"Asia/Shanghai",即GMT+8的北京时间,那么执行日期转字符串的format方法时,由于日期生成时默认是操作系统时区,因此2013-1-31 22:17:14是北京时间,那么推算到GMT时区,自然是要减8个小时的;而执行字符串转日期的parse方法时,由于字符串本身没有时区的概念,因此2013-1-31 22:17:14就是指GMT(UTC)时间【ps:所有字符串都看做是GMT时间】,那么当转化为日期时要加上默认时区,即"Asia/Shanghai",因此要加上8个小时。
● 用Calendar的话,如下:
运行结果:
Calendar不涉及到日期与字符串的转化,因此不像SimpleDateFormat那么复杂,与日期转字符串的思路类似。但是需要注意的是,设置完时区后,我们不能用calendar.getTime()来直接获取Date日期,因此此时的日期与一开始setTime时是相同值,要想获取某时区的时间,正确的做法是用calendar.get()方法,那么我们怎么获得Date类型的日期呢?
正确的做法如下:
运行结果:
● 完美通用转换方法
其实上面两个转换方法都要受到操作系统的时区设置影响,如果软件在不同操作系统运行,仍然会有时间误差,那么怎么才能统一呢?
运行结果:
通过以上可以看出时区确实有不少需要我们注意和专研的地方,其实这并不是什么高深的东西,也是java日期里的基础,我认为盲目学习各种开源框架并不能成为真正的高手,框架也是基于jdk的基础上开发而来的,不懂jdk的基本知识,想真正提高到架构师的级别是非常苦难的,因此基础很重要,掌握jdk基本功确实是成为“大侠”的前提条件,共同努力吧!
- java处理时区的注意事项
- Java处理时区的注意事项
- java处理时区的注意事项
- Java中处理时区的转换
- Java中处理时区的转换
- Java时区处理
- python的时区处理
- java 8 以下,时区处理
- 带时区的时间MySQL以及java中的处理
- java异常处理的六个注意事项
- JAVA-使用异常处理语句的注意事项
- java进行异常处理时的注意事项
- 时区处理
- JAVA Exception 处理注意事项
- Java异常处理注意事项
- JAVA异常处理注意事项
- java异常处理注意事项
- JAVA并发处理注意事项
- sqlserver2008R2数据导入还原的经历
- c++之标准库类型string
- org.hibernate.LazyInitializationException: failed to lazily initialize
- char s[] = "abcdef";"abcdef"是在栈区还是堆区?
- 小记:关于STM32进入低功耗模式后无法烧写程序的解决办法
- java处理时区的注意事项
- Linux Mysql 1130错误解决
- 在homestead下创建laravel/lumen项目
- tf.transpose
- js入门,和程序基础
- vue.js中报错: TypeError: Cannot read property 'indexOf' of undefined
- https://wenku.baidu.com/view/1f9138e903d8ce2f01662306.html
- c/c++失配指针
- map