天天看点

java时区,时间处理类等概念总结

Java中时区概念

UTC: 协调世界时,又称世界统一时间、世界标准时间、国际协调时间。UTC也是指零时区的时间。协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。协调世界时区使用“Z”来表示。

GMT: 格林尼治标准时间。格林尼治标准时间是19世纪中叶大英帝国的基准时间,同时也是事实上的世界基准时间。

GMT和UTC对比: 在不需要精确到秒的情况下,通常将GMT和UTC视作等同。但UTC 更加科学更加精确,它是以原子时为基础,在时刻上尽量接近世界时的一种时间计量系统。在平常的java开发中将GMT和UTC视作相等即可。

Asia/Shanghai: 我们平常开发默认使用的时区,也可以简单的认为等同于东八区时区(UTC/GMT+08:00),即比世界标注时间快8个小时。程序运行如下:其中ZoneId是Java8新加的代表一个时区的类。

java时区,时间处理类等概念总结

上述代码以及时间输出格式分析: 可以看出,Asia/Shanghai和UTC相差时间基本为8个小时

System.out.println(Instant.now());
System.out.println(LocalDateTime.now());
System.out.println(ZonedDateTime.now());
System.out.println(LocalDateTime.now(ZoneId.of("+00:00"))); //0时区的现在时间
System.out.println(ZonedDateTime.now(ZoneId.of("+00:00"))); //0时区的现在时间

---------------------------------------------------
//世界标准时间,其中T表示时分秒的开始(或者日期与时间的间隔),Z表示这是一个世界标准时间
2019-12-05T09:50:22.874Z
//不含时区信息的时间,末尾没有Z
2019-12-05T17:50:22.968
//含有时区信息的时间,+08:00表示该时间是由世界标准时间加了8个小时得到的,[Asia/Shanghai]表示时区
2019-12-05T17:50:22.969+08:00[Asia/Shanghai]
2019-12-05T09:50:22.874
2019-12-05T09:50:22.874Z
           

Java8时间类对比

主要4类: String、Instant、LocalDateTime、ZonedDateTime。String是格式化的时间,Instant是时间戳,LocalDateTime是不含时区信息的时间,ZonedDateTime是含有时区信息的时间。

  • 其中String和LocalDateTime是等价的,本质上都是以字符串的形式输出,不带有任何时区信息。
  • Instant与ZonedDateTime是等价的,两者都是带有时区信息的。

其它一些类以及示例:

Clock: 该类用于获取指定时区的当前日期、时间。可取代System类的currentTimeMillis()方法,而且提供了更多方法来获取当前日期、时间。
Duration: 该类代表持续时间。可以非常方便地获取一段时间。
LocalDate: 该类代表不带时区的日期,例如2019-12-05。
LocalTime: 该类代表不带时区的日期,例如18:20:20。
MonthDay: 该类仅代表月日,例如--04-12。注意月份前面会有两个横杠。
Year: 该类仅代表年,例如2019。
YearMonth: 该类仅代表年月,例如2019-12。
DayOfWeek: 这是一个枚举类,定义了周日到周六的枚举值。
Month: 这也是一个枚举类,定义了一月到十二月的枚举值。
           

上述时区说明可参考以下两个博客:https://www.cnblogs.com/jixp/articles/10587494.html

https://www.cnblogs.com/oldtrafford/p/9680791.html

时区以及时间类对比可参考(个人觉得写的蛮好的):https://blog.csdn.net/u012107143/article/details/78790378

时间格式类

DateFormat: DateFormat是一个抽象类,它提供了如下几个类方法用于获取DateFormat对象。目前基本不怎么使用了,一般都使用SimpleDateFormat。但是这边还是记录一下。

  • getDateInstance(): 返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale(简单来说是用于提供国际化参数,里面有不同的国家和语言记录)等采纳数;如果不指定这些参数,则使用默认参数。
  • getTimeInstance(): 返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。
  • getDateTimeInstance(): 返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。

  上面三个方法可以指定日期样式.时间样式参数,它们是DateFormat的4个静态常量:FULL、LONG、MEDIUM和SHORT,通过这4个样式参数可以控制生成的格式化字符串。反之,将字符串解析成Date对象时,也要符合上述4个样式参数。其中MEDIUM为默认方式(可查看源码)。具体字符串格式如下:

java时区,时间处理类等概念总结

将字符串解析为Date的代码如下所示,对应的,将Date解析成字符串使用的是format函数,传入Date对象即可:

java时区,时间处理类等概念总结
java时区,时间处理类等概念总结

SimpleDateFormat: 前面介绍的DateFormat的parse()方法可以把字符串解析成Date对象,但实际上DateFormat的parse()方法不够灵活-它要求被解析的字符串必须满足特定的格式!为了更好地格式化日期、解析日期字符串,Java提供了SimpleDateFormat类。

  SimplateDateFormat是DateFormat的子类,正如它的名字所暗示的,它是“简单”的日期格式器。SimpleDateFormat比DateFormat更简单,但功能却更强大。下面给出示例:

Date d1 = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("Gyyyy年中第D天");
//将d1格式化成字符串,输出:公元2019年中第339天
String dateStr = sdf1.format(d1);
System.out.println(dateStr);

String str = "2019-12-05";
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
Date d2 = sdf2.parse(str);
//将日期字符串解析成日期,输出:Thu Dec 05 00:00:00 CST 2019
System.out.println(d2);
           

  从上面的程序中可以看出,使用SimpleDateFormat可以将日期格式格式化成形如“公元2019年中第339天”这样的字符串,也可以把形如“2019-12-05”这样的字符串解析成日期,功能非常强大。SimpleDateFormat把日期格式化成怎样的字符串,以及能把怎样的字符串解析成Date,完全取决于创建该对象时指定的pattern参数,pattern是一个使用日期字段占位符的日期模板。

DateTimeFormatter: 该类是Java8新增的日期、时间格式器,主要用于LocalDateTime,LocalDate,LocalTime等Java8新增的时间类。该类位于java.time.format包下面,相当于前面介绍的DateFormat和SimpleDateFormat的合体,功能相当强大。

  为了使用DateTimeFormatter进行格式化和解析,必须先获取DateTimeFormatter对象,获取DateTimeFormatter对象有如下三种常见的方式。

  • 直接使用静态常量创建DateTimeFormatter格式器。DateTimeFormatter类中包含了大量形如ISO_LOCAL_DATE、ISO_LOCAL_TIME 、ISO_LOCAL_DATE_TIME等静态常量,这些静态常量本身就是DateTimeFormatter实例。
  • 使用代表不同风格的枚举值来创建DateTimeFormatter格式器。在FormatStyle枚举类中定义了FULL、LONG、MEDIUM、SHORT四个枚举值,他们代表日期、时间的不同风格。
  • 根据模式字符串来创建DateTimeFormatter格式器。类似于SimpleDateFormat,可以采用模式字符串来创建DateTimeFormatter,如果需要了解DateTimeFormatter支持哪些模式字符串,则需要参考该类得API文档。

简单代码示例

LocalDateTime ldt1 = LocalDateTime.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//将ldt1格式化成字符串,输出:2019-12-05 20:17:40
String dateStr1 = dtf1.format(ldt1);
System.out.println(dateStr1);

String dateStr2 = "2019-12-05 20时16分42秒";
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH时mm分ss秒");
//将日期字符串解析成日期,输出:2019-12-05T20:16:42
LocalDateTime ldt2 = LocalDateTime.parse(dateStr2,dtf2);
System.out.println(ldt2);
           

部分内容参考自疯狂java讲义第四版,若有侵权,欢迎联系删除。