说起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:14

String 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:14

System.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 时区处理_JAVA时区处理(转)相关推荐

  1. java时区问题_Java时区问题

    Java时区相关 时间格式 UTC是以原子时计时,更加精准,适应现代社会的精确计时.不过一般使用不需要精确到秒时,视为等同.GMT是前世界标准时,UTC是现世界标准时.每年格林尼治天文台会发调时信息, ...

  2. java时区_Java时区

    java时区 Java TimeZone class represents a time zone offset, and also figures out daylight savings. Tim ...

  3. java对世界各个时区(TimeZone)的通用转换处理方法

    2019独角兽企业重金招聘Python工程师标准>>> 关于如何知道客户所在的时区,可以根据客户所在的ip或者用户注册提供的国家来计算出所在的时区. package cn.telep ...

  4. Java Calendar如何设置时区呢?

    转自: Java Calendar如何设置时区呢? 下文讲述使用Calendar类设置时区的方法分享,如下所示: 实现思路:1.使用TimeZone设置相应的时区2.使用Calendar类中的setT ...

  5. JAVA所用到的时区

    JAVA所用到的时区 Etc/GMT+12 Etc/GMT+11 MIT Pacific/Apia Pacific/Midway Pacific/Niue Pacific/Pago_Pago Paci ...

  6. java utc 转换pst_时区时差换算(GMT,UTC,PST,PDT)

    2014年美国冬令时标准时间Stardand Time于11月2号开始实施,直到2015年3月8号为止. 冬令时,是指在冬天使用的标准时间.在使用日光节约时制(夏令时)的地区,夏天时钟拨快一小时,冬天 ...

  7. ubuntu修改系统时区和jvm时区

    比喻我希望服务器是西太平洋时间 tzselect 在弹出框依次选择 Pacific Ocean > US ... cp /usr/share/zoneinfo/America/Los_Angel ...

  8. java拆分日期_java实现日期拆分的方法

    java实现日期拆分的方法 本文实例讲述了java实现日期拆分的方法.分享给大家供大家参考.具体如下: 如:计算6-1至6-5之间的日期天数及具体日期,预期的结果是得到: 6-1 6-2 6-3 6- ...

  9. java 时间类_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

  10. java 公元前时间_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

最新文章

  1. 包含重复数字序列的全排列Python解法
  2. CF750E-New Year and Old Subsequence【动态dp】
  3. 数学题 HDOJ——2086 简单归纳
  4. 计蒜客NOIP2017提高组模拟赛(四)day1
  5. 今日头条架构演进之路——高压下的架构演进专题(含PPT)
  6. python 去掉转义字符_python前期准备
  7. 分布式服务框架-原理与实践:15---服务降级-学习笔记
  8. DataTable,List和Json的转换
  9. Jquery的validate表单验证
  10. 高数——多元函数的定义及极限
  11. rust货轮什么时候出现_中国最早的汉字出现于什么时候?
  12. Activiti7工作流引擎介绍
  13. 《一罐猪油》——迟子建
  14. java多线程(8):Lamda表达式
  15. H5浏览器下无插件、低延时、RTSP视频流直播
  16. HGOI 20190711 题解
  17. XTU OJ 1355 Euler‘s Totient Function(欧拉函数)
  18. pc系统设计演变_设计师的演变
  19. docker 批量垃圾清理
  20. phpddos应对 最近新起一种udp flood的攻击形式

热门文章

  1. git clone大仓库(>1G)时速度慢并出现RPC failed断开连接错误的真正解决方法
  2. Excel和WPS 下设置多种不同条件的条件格式
  3. python-opencv标定相机内参(针孔+鱼目)
  4. c语言分数乘法,武汉小学数学六年级
  5. 1.居民身份证号码,由17位数字本体码,和1位数字校验码组成 2.判断用户输入的身份证号码是否合法 规则为:号码为18位,不能以0开头,前17位只可以是数字,最后一位可以是数字或‘X‘
  6. bgp 服务器 验证,什么是所谓的BGP协议_BGP服务器指什么?
  7. 证书错误 SSLCertVerificationError
  8. java month_Java MonthDay getMonth()用法及代码示例
  9. 有感于李连杰壹基金计划
  10. pip install使用豆瓣库