zoukankan      html  css  js  c++  java
  • SimpleDateFormat 转化毫秒到日期时,指定特定的时区

    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. }  

    运行结果:

    [plain] view plain copy
     
    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的话,如下:

    [java] view plain copy
     
    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. }  

    运行结果:

    [plain] view plain copy
     
    1. Thu Jan 31 22:17:14 CST 2013  
    2. 14:17  

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

    正确的做法如下:

    [java] view plain copy
     
    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. }  

    运行结果:

    [plain] view plain copy
     
    1. Thu Jan 31 22:17:14 CST 2013  
    2. Thu Jan 31 14:17:14 CST 2013  

    ● 完美通用转换方法

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

    [java] view plain copy
     
    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.  * 获取更改时区后的日期 
    10.  * @param date 日期 
    11.  * @param oldZone 旧时区对象 
    12.  * @param newZone 新时区对象 
    13.  * @return 日期 
    14.  */  
    15. public static Date changeTimeZone(Date date, TimeZone oldZone, TimeZone newZone) {  
    16.     Date dateTmp = null;  
    17.     if (date != null) {  
    18.         int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();  
    19.         dateTmp = new Date(date.getTime() - timeOffset);  
    20.     }  
    21.     return dateTmp;  
    22. }  

    运行结果:

    [plain] view plain copy
     
    1. Thu Jan 31 22:17:14 CST 2013  
    2. Thu Jan 31 14:17:14 CST 2013  
  • 相关阅读:
    [洛谷P2745] [USACO5.3]窗体面积Window Area
    [洛谷P2751] [USACO4.2]工序安排Job Processing
    [洛谷P2738] [USACO4.1]篱笆回路Fence Loops
    [洛谷P4609] [FJOI2016]建筑师
    [洛谷P3228] [HNOI2013]数列
    解决Qt5使用SSL的“qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method”错误
    qt查看是否支持SSL
    qt获取依赖的openssl的版本
    qt关闭ssl验证,解决不能正常使用自签署ssl证书API的问题
    使用OpenSSL创建HTTPS所使用的SSL证书
  • 原文地址:https://www.cnblogs.com/shuiyelifang/p/5682061.html
Copyright © 2011-2022 走看看