http://blog.csdn.net/wangpeng047/article/details/8560690

影响TimeZone的因素:

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

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

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

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

● 用SimpleDateFormat的话,如下:

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

运行结果:

  1. Fri Feb 01 06:17:14 CST 2013
  2. 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的话,如下:

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

运行结果:

  1. Thu Jan 31 22:17:14 CST 2013
  2. 14:17

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

正确的做法如下:

  1. public static void main(String[] args) {
  2. Date date = new Date(1359641834000L);
  3. System.out.println(date);
  4. Calendar calendar = Calendar.getInstance();
  5. calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
  6. // 或者可以 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
  7. calendar.setTime(date);
  8. Calendar calendar2 = Calendar.getInstance();
  9. 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));
  10. System.out.println(calendar2.getTime());
  11. }

运行结果:

  1. Thu Jan 31 22:17:14 CST 2013
  2. Thu Jan 31 14:17:14 CST 2013

● 完美通用转换方法

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

  1. public static void main(String[] args) {
  2. Date date = new Date(1359641834000L);
  3. System.out.println(date);  (仅此一句即可)
  4. date = changeTimeZone(date, TimeZone.getTimeZone("Asia/Shanghai"), TimeZone.getTimeZone("GMT"));
  5. System.out.println(date);
  6. }
  7. /**
  8. * 获取更改时区后的日期
  9. * @param date 日期
  10. * @param oldZone 旧时区对象
  11. * @param newZone 新时区对象
  12. * @return 日期
  13. */
  14. public static Date changeTimeZone(Date date, TimeZone oldZone, TimeZone newZone) {
  15. Date dateTmp = null;
  16. if (date != null) {
  17. int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();
  18. dateTmp = new Date(date.getTime() - timeOffset);
  19. }
  20. return dateTmp;
  21. }

运行结果:

  1. Thu Jan 31 22:17:14 CST 2013
  2. Thu Jan 31 14:17:14 CST 2013

最新文章

  1. 原创 C++之常量(一)
  2. C#反射机制 Type类型
  3. 【Android学习日记】
  4. 如何让webapi只返回json格式数据
  5. DataGrid中取HyperLinkColumn列的值,处理DataGrid中绑定的特殊字符
  6. 如何发送HTML表单数据
  7. ASP.NET NuGet to install the mvc 5.2.2
  8. TreeView 数据绑定及选中命令处理
  9. CSS3入门
  10. MySQL优化-一 、缓存优化
  11. nsq源码阅读笔记之nsqd(四)——Channel
  12. BZOJ_1031_[JSOI2007]字符加密Cipher_后缀数组
  13. PHP中ajax返回数据类型为JSON数据的处理
  14. Python3学习笔记27-ConfigParser模块
  15. JavaScript之form表单的序列化和json化[form.js]
  16. C++类的大小——sizeof(class)
  17. springboot security 获取当前登录用户名
  18. 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务
  19. IoC COntainer Create Javabeans 可以通过读取beans.xml 文件来创建一个应用程序上下文对象 依赖反转
  20. Unity面试问题归总

热门文章

  1. Hadoop 2.4.0完全分布式平台搭建、配置、安装
  2. Portal:十大免费建站程序推荐
  3. C#压缩、解压缩文件(夹)(rar、zip)
  4. [转载]MongoDB C# 驱动教程
  5. Linux的直接I/O机制
  6. Moloch
  7. Java免费开源数据库、Java嵌入式数据库、Java内存数据库
  8. 如何将Springside4项目转成Eclipse项目
  9. perl + 匹配前导模式一次或者多次
  10. java web路径的问题