一、GMT(格林威治时间)Greenwich Mean Time
以经过格林威治的子午线为零度经度线(本初子午线),把地球分为东西两半,进行时间的计算;
精确度相对较低;
GMT本地时间,是由时区换算得到的;
XP系统中,默认时间格式是GMT。
二、UTC(世界协调时)Coordinated Universal Time
以国际原子时作为计量单位,更为精确;UTC没有时区的概念,只有偏移量;
Win7之后,默认时间格式已经改成了UTC;
UTC时间格式为:YYYY-MM-DDThh:mm:ssZ
例如,2014-11-11T12:00:00Z(为北京时间2014年11月11日20点0分0秒);
若现在UTC时间是 10:30z(z表示偏移量=0,不可省略),则北京时间为 10:30 +0800、纽约时间为 10:30 -0500,分别表示同日下午6点半、同日上午五点半。
中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。
三、时间戳
计算机中的UNIX时间戳,是以GMT/UTC时间「1970-01-01T00:00:00」为起点
四、java处理日期时间
1、jdk1-7
使用java.util.date处理日期时间;Java使用java.util.TimeZone来表示时区
Date对象里存的是自格林威治时间( GMT)1970年1月1日0点至Date所表示时刻所经过的毫秒数,是个数值。
currDate.toString()——Fri Jan 15 10:22:34 CST 2021
以上输出标准的UTC时间(CST就代表了偏移量 +0800)
实际业务中,需要对输出的时间进行格式化,使用java.text.DateFormat去处理;
Java中对Date类型的输入输出/格式化,推荐使用DateFormat而非用其toString()方法;
DateFormat是一个时间格式化器抽象类,SimpleDateFormat是其具体实现类,用于以语言环境敏感的方式格式化和解析日期。它允许格式化(日期→文本)、解析(文本→日期)和规范化。
2、jdk8+
使用JSR 310日期/时间;所有的 API都在java.time这个包内。
使用了ZoneId表示时区,ZoneOffset表示UTC的偏移量。
LocalXXX表示本地时间,也就是说是当前JVM所在时区的时间;ZonedXXX表示是一个带有时区的日期时间,它们能非常方便的互相完成转换。
针对JSR 310日期时间类型的格式化/解析,有个专门的类java.time.format.DateTimeFormatter用于处理。
DateTimeFormatter也是一个不可变的类,所以是线程安全的。
3、处理方式
五、知识扩展
1、夏时令
离现在最近是1986年至1991年用过夏令时(每年4月中旬的第一个周日2时 - 9月中旬的第一个星期日2时止): 1986年5月4日至9月14日 1987年4月12日至9月13日 1988年4月10日至9月11日 1989年4月16日至9月17日1990年4月15日至9月16日 1991年4月14日至9月15日
夏令时是一个“非常烦人”的东西,大大的 增加了日期时间处理的复杂度。比如这个灵魂拷问:若你的出生日期是1988-09-11 00:00:00(夏令时最后一天)且存进了数据库,想一想,对此日期的格式化有没有可能就会出问题呢,有没有可能被你格式化成1988-09-10 23:00:00呢?