时间与时区

其实我一直都搞不懂Java中的时区是怎么计算的,后来看了一下源代码发现好简单啊。。。
当我们执行new Date()时,其实就是把当前的unix时间戳创建为Date对象。
new Date(System.currentMills())是等效的。
那unix的时间其实可以等同于UTC时间,所以用这个方法创建的Date是UTC时区。
但是,我个人认为Date其实没有时区的概念,他只是用来表示时间属性的一种对象
为什么会有时区呢?因为unix的时间是UTC(GMT)的,而我们生活的地区不一定是UTC时区,假如我们在亚洲时区(Asia/Shanghai),那其实是比UTC快8个小时(GMT +8)
这个时候的Date如果字符串化,需要变成正确用户当地的日期,总不能都显示UTC的时间对吧?(闹钟响了,发现自己已经被辞退了,GG)
所以时区就在这里体现,Date 与 String 互相转化
那么什么时候会用到这种转化呢?一般是用在SimpleDateFormat这里

 SimpleDateFormat asiaSDF = new SimpleDateFormat("yyyy-MM-dd-hh");
        asiaSDF.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        try {
            return asiaSDF.parse(date);
        } catch (ParseException e) {
             ...
        }
    }

上面的代码示例代表字符串转日期对象(String -> Date)
如果不规定时区,那么转换后的date和字符串的时间相同
如果规定了时区,那么转换后的date比字符串的时间少8个小时
(简单地理解为date永远是utc时间,上层应用需要确保时间的正确性)

相反的转换也是类似的,只是输出的string是date的+8个小时

很简单吧

你可能感兴趣的:(时间与时区)