java中Date类之GMT、UTC

本文介绍了时间标准GMT和UTC的区别,以及它们与时间戳的关系。GMT基于格林威治子午线,而UTC更精确,基于国际原子时。在Java中,JDK1.7及以前使用java.util.Date和DateFormat处理日期时间,JDK8+引入了JSR310,提供更好的日期时间API。文章还提到了夏令时对日期处理的影响,并讨论了处理日期时间的挑战。
摘要由CSDN通过智能技术生成

一、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呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值