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

SimpleDateFormat 转化毫秒到日期时,指定特定的时区的更多相关文章

  1. 执行Android项目时指定特定的AVD进行測试

    一个Androidproject空间能够创建一个或多个AVD来对指定的Android项目进行測试,假设仅仅创建了一个AVD则执行Android项目时自然启动该AVD,但是假设创建了多个AVD那么我们该 ...

  2. 安装特定版本 sysbench 以及安装时指定特定的mysql客户端

    step1: 下载安装源码 https://github.com/akopytov/sysbench (git clone https://github.com/akopytov/sysbench.g ...

  3. 使用SimpleDateFormat 将毫秒转换成时分秒 格式:HH:mm:ss

    public static String dateFormatFromMilliSecond(long seconds) {        //初始化format格式    SimpleDateFor ...

  4. js,将日期时分秒等格式化和转化

    1.将js Date对象格式化为指定格式,添加一个原型方法 /** * 返回指定format的string * format eg:'yyyy-MM-dd hh:mm:ss' **/ Date.pro ...

  5. Maven打包时过滤测试代码或指定特定的测试类(maven-surefire-plugin)

    1.过滤整个测试代码,可以直接在命令行上指定 mvn clean install -Dmaven.test.skip=true 提示:以上为举例,具体的构建阶段可以自定义,其中maven.test.s ...

  6. excel时间戳转化为标准日期(日期转化为日期戳)

    最近在学习python将数据导入到excel,发现日期变成数字而不是日期格式的问题. 第一眼看去肯定是excel单元格格式问题,一般excel单元格格式为常规,而常规处理日期时就显示为数字,所以就想到 ...

  7. Java 毫秒转换为日期类型、日期转换为毫秒

    /毫秒转换为日期 public static void main(String[] args) { DateFormat formatter = new SimpleDateFormat(" ...

  8. 在使用EF时,想要比较字符串类型的日期时

    原文地址(https://blog.csdn.net/yangxinyue315/article/details/44960895) 在使用EF时,想要比较字符串类型的日期时 在使用EF时,想要比较字 ...

  9. Mybatis映射文件中#取值时指定参数相关规则

    Mybatis映射文件中#取值时指定参数相关规则 在#{}中,除了需要的数值外,还可以规定参数的一些其他规则. 例如:javaType,jdbcType,mode(存储过程),numericScale ...

随机推荐

  1. WordPress 前端用户投稿插件 Frontend Publishing

    WordPress添加投稿功能(无需注册/可邮件通知站长和投稿人) WordPress匿名投稿插件:DX-Contribute (有朋友反馈不能用) WordPress投稿插件:User Submit ...

  2. Hadoop集群系类文章

    http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html 后续文章地址:http://www.xiapistudio.com/ta ...

  3. poj 1811 Prim test

    基本上一个裸的Miller_Rabin大素数判定和一个裸的Pollard_rho素数分解算法,当模板用吧! #include<cstdio> #include<algorithm&g ...

  4. HDOJ多校联合第五场

    1001 Inversion 题意:求逆序对,然后交换k次相邻的两个数,使得剩下的逆序对最少. 分析:题目用到的结论是:数组中存在一对逆序对,那么可以通过交换相邻两个数使得逆序对减少1,交换k次,可以 ...

  5. UVA 10896 Sending Email

    这个题目真是伤透脑筋了,一直RE,连着改了好几个版本,又是spfa,又是单调队列dijkstra+单调队列,总是不过,后来发现M开小了,双向边应该开m的两倍,悲剧啊!!!以后不管怎样,数组一定要尽量开 ...

  6. 李洪强漫谈iOS开发[C语言-020]-scanf的本质

    scanf是有返回值和参数的

  7. easyui源码翻译1.32--ComboTree(树形下拉框)

    前言 扩展自$.fn.combo.defaults和$.fn.tree.defaults.使用$.fn.combotree.defaults重写默认值对象.下载该插件翻译源码 树形下拉框结合选择控件和 ...

  8. 在Qt中使用sleep(包含为win and *nix下sleep函数的实现及用法)

    http://blog.csdn.net/tingsking18/article/details/5304254 关于sleep函数,我们先来看一下他的作用:sleep函数是使调用sleep函数的线程 ...

  9. 释放SQL Server占用的内存

    由于Sql Server对于系统内存的管理策略是有多少占多少,除非系统内存不够用了(大约到剩余内存为4M左右),Sql Server才会释放一点点内存.所以很多时候,我们会发现运行Sql Server ...

  10. xml解析代码示例

    List<Entry> list = new ArrayList<>(); Entry entry = null; try { int eventType = response ...