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

  提升工作效率利器:

‎Mac App Store 上的“Whale - 任务管理、时间、卡片、高效率”

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

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()方法返回的的时间是你设置了时区的时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值