现在的位置: 首页 > 综合 > 正文

0003 容易混淆的格林威治时间和不同于格林威治时区的时间转化【基础】

2014年08月27日 ⁄ 综合 ⁄ 共 1244字 ⁄ 字号 评论关闭

我们获取系统的时间方法有:

1、System.currentTimeMillis()

2、Date date = new Date();

      date.getTime();

3、Calendar cal = Calendar.getInstance();

      cal.getTimeInMillis();

以上三个是常见的获取系统时间的方法,三个返回值都是距离格林威治时间1970年1月1号00:00:00的毫秒数。不管我们所处国家的时区如何,其返回值都是一样的。

 

再看如下两个方法:

1、Date date = new Date();

      date.getTime();

      date.toString();

      date.toGMTString();

2、Calendar cal = Calendar.getInstance();

     cal.getTimeInMillis();

      cal.toString();

以上三两个方法中的toString()toGMTString()返回的确是我们所处的国家时区对应的时间,不同时区返回值不一样。那么为什么date.getTime()返回的是格林威治时间,而date.toString()返回的却是我们所处时区的时间呢?

那就去看看Date类的toString()方法到底做了哪些操作,原来Date类重写了toString()方法,toString()方法根据从系统获取到的时区或者我们显示设置的时区,将格林威治时间调整成我们时区下的时间。我们可以通过cal.setTimeZone(TimeZone.getTimeZone("GMT+8"))来设置时区,其中GMT+8代表的是中国的时区,中国时区的时间比格林威治时间快8个小时;所以要是我们想把date.getTime()方法获取到的格林威治时间转化成中国时区的时间,只要将date.getTime()+8个小时就行了。

还有如下代码:

Date date = new Date();

System.out.println(date);

打印的结果是我们所处时区的时间,是因为将Date类的引用输出时默认回去调用Date的toString()方法。

 

从上面我们可以看出一条规律,Date和Calendar类的设计原则是,只要显示出来的时间(如XX年、XX月、XX号)都是根据具体时区调整后的,只要是获取毫秒数的都是距离格林威治时间1970年1月1号00:00:00秒的毫秒数。

最后补充一个重点:即使通过cal.setTimeZone(TimeZone.getTimeZone("GMT+8"))设置了时区,cal.getTimeInMillis()date.getTime()获取的还是格林威治时间,通过cal.setTimeZone(TimeZone.getTimeZone("GMT+8"))设置时区的作用是cal.toString()
date.toString()
方法返回的的时间是你设置了时区的时间。

抱歉!评论已关闭.