代码地址:https://code.csdn.net/luo4105/javautilclass/tree/master下的TimeZoneTest.java文件。
时区是人为划定的,以本初子午线中心(英国格林尼治天文台),将地球划为24个时区。时区向东加一区,时间调快一小时,时区向西加一区,时间调慢一小时。如北京为东八区,日本为东九区,北京时间比日本晚一小时。
时区有0时区、东1-12区,西1-12区共24区,(这明明是25个区,莫非当年划分时区的英国人数学太差算错了?)。当然不是,实际上,东12区和西12区划为一个区,称东西12区,东12区占其中一半,西12区占其中一半,从东12区进入西12区,时间调慢1天。
GMT是即格林尼治平太阳时间,实际就是零时区的时间。用”GMT+偏移量”来表示时区。如“GMT+1”代表东一区,时间就是零时区时间加1小时;”GMT-1”就是西1区,时间就是零时区时间减1小时;我国位于东八区,就是”GMT+8”。
UTC是标准时间,也就是零时区的时间。
Java存的是从1997/1/1 00:00:00到现在时间的毫秒数,按的是标准时间存储。如setDate(0)就是1997/1/1 00:00:00。但是获取时会加上时间的偏移量,我们是东八区,所以setDate(0)的显示是1997/1/1 08:00:00。
由于java中存的是标准时区的时间,只是获取时转成本地时区,所以我们只要对时间设置时区,就能获得对应时区的时间。
TimeZone是Java中处理时区的类。
Calendar cal = Calendar.getInstance();
TimeZone timeZone = cal.getTimeZone();
System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getDefault();
System.out.println(timeZone1.getID());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
TimeZone timeZone2 = simpleDateFormat.getTimeZone();
System.out.println(timeZone2.getID());
打印
Asia/Shanghai
Asia/Shanghai
Asia/Shanghai
注意java和php时区中没有asia/beijing,只有asia/shanghai和asia/chongqing,这是民国时期划分的时区。曾经有程序员向sun提出这个问题,但sun不予采纳,认为不是bug。对此我认为应该添加asia/beijing,毕竟新中国以北京时间为标准时间,以示对中国的尊重。毕竟中国是个大国。
TimeZone timeZone = TimeZone.getTimeZone("GMT+2");
System.out.println(timeZone.getID());
TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Shanghai");
System.out.println(timeZone1.getID());
打印
GMT+02:00
Asia/Shanghai
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+2"));
cal.setTime(new Date());
System.out.println((cal.get(Calendar.MONTH) + 1) + "-" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR_OF_DAY) + ":" + cal.get(Calendar.MINUTE));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));
System.out.println(simpleDateFormat.format(new Date()));
System.out.println(DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT+2")))
打印
8-29 5:36
2017-08-29 05:36:35
2017-08-29 05:36:35
Calendar cal = Calendar.getInstance();
long offset = cal.get(Calendar.ZONE_OFFSET);
System.out.println(offset/60/60/1000);
TimeZone timeZone = TimeZone.getDefault();
long offset1 = timeZone.getOffset(Calendar.ZONE_OFFSET);
System.out.println(offset1/60/60/1000);
打印
8
8