说起java中的时间,大家或许都很熟悉,朗朗上口的Date、Calendar、SimpleDateFormat等。但是大家对他们的认识真的很深刻吗?今天我要想大家说的是TimeZone,即时区。

经常有人发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone。只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的。

影响TimeZone的因素:

1. 操作系统的时区设置。

2. 数据传输时时区设置。

第一个原因其实是根本原因,当数据在不同操作系统间流转时,就有可能因为操作系统的差异造成时间偏差,而JVM默认情况下获取的就是操作系统的时区设置。因此在项目中最好事先设置好时区,例如:

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));

那么一旦时区设置不同导致时间有偏差怎么办?如何转化呢?

● 用SimpleDateFormat的话,如下:

 public static void main(String[] args) {Date date = new Date(1359641834000L);// 2013-1-31 22:17:14String dateStr = "2013-1-31 22:17:14";SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));try {Date dateTmp = dateFormat.parse(dateStr);System.out.println(dateTmp);} catch (ParseException e) {e.printStackTrace();}String dateStrTmp = dateFormat.format(date);System.out.println(dateStrTmp);}

运行结果:

Fri Feb 01 06:17:14 CST 2013
2013-01-31 14:17:14

我们发现同一时间,字符串和日期运行出来的结果并不相同,那么我们应该怎么理解呢?一切都要以当前操作系统的时间为基准。我的操作系统是"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的话,如下:

 public static void main(String[] args) {Date date = new Date(1359641834000L);// 2013-1-31 22:17:14System.out.println(date);Calendar calendar = Calendar.getInstance();calendar.setTimeZone(TimeZone.getTimeZone("GMT"));// 或者可以 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));calendar.setTime(date);System.out.println(calendar.get(Calendar.HOUR_OF_DAY) + ":" + calendar.get(Calendar.MINUTE));}

运行结果:

Thu Jan 31 22:17:14 CST 2013
14:17

Calendar不涉及到日期与字符串的转化,因此不像SimpleDateFormat那么复杂,与日期转字符串的思路类似。但是需要注意的是,设置完时区后,我们不能用calendar.getTime()来直接获取Date日期,因此此时的日期与一开始setTime时是相同值,要想获取某时区的时间,正确的做法是用calendar.get()方法,那么我们怎么获得Date类型的日期呢?

正确的做法如下:

 public static void main(String[] args) {Date date = new Date(1359641834000L);System.out.println(date);Calendar calendar = Calendar.getInstance();calendar.setTimeZone(TimeZone.getTimeZone("GMT"));// 或者可以 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));calendar.setTime(date);Calendar calendar2 = Calendar.getInstance();calendar2.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND));System.out.println(calendar2.getTime());}

运行结果:

Thu Jan 31 22:17:14 CST 2013
Thu Jan 31 14:17:14 CST 2013

● 完美通用转换方法

其实上面两个转换方法都要受到操作系统的时区设置影响,如果软件在不同操作系统运行,仍然会有时间误差,那么怎么才能统一呢?

 public static void main(String[] args) {Date date = new Date(1359641834000L);System.out.println(date);date = changeTimeZone(date, TimeZone.getTimeZone("Asia/Shanghai"), TimeZone.getTimeZone("GMT"));System.out.println(date);}/*** 获取更改时区后的日期* @param date 日期* @param oldZone 旧时区对象* @param newZone 新时区对象* @return 日期*/public static Date changeTimeZone(Date date, TimeZone oldZone, TimeZone newZone) {Date dateTmp = null;if (date != null) {int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();dateTmp = new Date(date.getTime() - timeOffset);}return dateTmp;}

运行结果:

Thu Jan 31 22:17:14 CST 2013
Thu Jan 31 14:17:14 CST 2013

通过以上可以看出时区确实有不少需要我们注意和专研的地方,其实这并不是什么高深的东西,也是java日期里的基础,我认为盲目学习各种开源框架并不能成为真正的高手,框架也是基于jdk的基础上开发而来的,不懂jdk的基本知识,想真正提高到架构师的级别是非常苦难的,因此基础很重要,掌握jdk基本功确实是成为“大侠”的前提条件,共同努力吧!

java处理时区的注意事项相关推荐

  1. java异常及日志注意事项

    java异常及日志注意事项 参考文章: (1)java异常及日志注意事项 (2)https://www.cnblogs.com/lq147760524/p/8475531.html 备忘一下.

  2. 关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了

    关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了

  3. 写java代码时的注意事项_从方法返回Java 8的可选项时的注意事项

    写java代码时的注意事项 Java 8引入的Optional类一直是该语言版本引入的最具争议的功能之一. 尽管我喜欢这个新的Java类的东西比不喜欢的东西多,但在Java方法中将其用作return类 ...

  4. java 上传文件注意事项

    java 上传文件注意事项 1.文件名有特殊字符的情况,所以最好是文件名前台url编码,后台再url解码,这点在下载的时候也一样 2.文件大小一定要设置,spring boot 有默认. 3.文件名校 ...

  5. java date 设置时区,Java 日期时区

    Java日期时区 ZoneOffset表示与UTC时区偏移的固定区域. ZoneOffset不跟踪由夏令时导致的区域偏移的更改. ZoneOffset类声明三个常量:UTC MAX MIN UTC是U ...

  6. Java开发规范及注意事项

    文章目录 Java开发规范及注意事项 编程规约 异常日志违约 单元测试规约 工程结构规约 数据库规约 Java开发规范及注意事项 编程规约 POJO类中布尔类型的变量,都不要加is前缀,否则部分框架解 ...

  7. 关于 Delphi跨平台开发Android调用 JNI JAR java 的说明和注意事项

    2Pascal-新时代的Pascal-关于 调用 JNI JAR java 的说明和注意事项,调用第 靠写不下了 - Powered by Discuz! 关于 调用 JNI JAR 的说明和注意事项 ...

  8. java 不同时区时间转换_Java对世界不同时区timezone之间时间转换的处理方法

    最近出现一个问题是这样的:我们的系统在国外打印的日志时间由于时差关系和国内不一致,看起来不方便,希望国外的日志和国内保持一致,即:需要对不同时区的时间做转换调整,统一为国内时间. 一.关于时区的一些概 ...

  9. java 获取时区的时间_如何使用Java获取时区的当前日期和时间?

    如何使用Java获取时区的当前日期和时间? 我的应用托管在伦敦服务器中. 我在西班牙马德里. 因此,时区为-2小时. 如何获取带有时区的当前日期/时间. Date curr_date = new Da ...

最新文章

  1. 我把梦打开,只为你进来
  2. python opencv投影变换增强
  3. 自定义注解:通过监控文件的变化,实时更改工厂管理的实例
  4. python math.asin
  5. MasterPage 小谈
  6. PowerShell挂起功能--Confirm参数
  7. 百度HR发布招聘信息要求“热爱小米文化”?百度回应:冒充的
  8. enlink请输入正确服务器地址,MXC极域有什么新的消息?
  9. 【开发日常】手动安装fastboot驱动(开发板连不上minitool)
  10. pycharm格式化的html_pycharm格式化代码 常用快捷键
  11. latex中页眉怎么去掉_LaTeX页面布局专题——页眉和页脚
  12. 百度招聘Android客服端(2)
  13. Codeforces 581A - Vasya the Hipster 题解
  14. 【汇智学堂】docker网络管理之一
  15. LEX自动生成词法分析器
  16. 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程
  17. 解决windows2012server中80端口被占用
  18. 一步一步oa办公系统java,OA项目 一个OA办公系统的java源码 联合开发网 - pudn.com
  19. Java问题集锦--org.apache.maven.archiver.MavenArchiver.getManifest错误
  20. 大数据项目一般金额多少_大数据工作月薪多少 就业前景好不好?

热门文章

  1. EM20在地铁闸机的二维码扫描的应用案例
  2. m1芯片mac安装mongoDB数据库
  3. MATLAB 基础知识 数据类型 表 修改单位、说明和表变量名称
  4. 微信公众号开发教程[019]-新版客服
  5. 全景分割调研(3) 当前研究现状
  6. 阿里云 EMR 基于 Apache DolphinScheduler 产品技术实践和社区贡献
  7. Plug And AI角蜂鸟AI开发板开箱,拆解
  8. 一文搞定 Google Play 应用的中文设置
  9. 更新摄影作品展示了欢迎大家加入支持点赞感谢大家的支持感谢大家
  10. html在线表格样式模板,HTML5+CSS3 表格设计(Table)