Java 8 推出了新的日期时间类,比较常使用的有LocalDateTime,ZonedDateTime,ZoneId,ZoneOffset,DateTimeFormatter,通过这几个类可以使处理时间问题变得简单并且不容易出错
定义
- LocalDateTime:A date-time without a time-zone in the ISO-8601 calendar system, such as
2007-12-03T10:15:30
. - ZonedDateTime:A date-time with a time-zone in the ISO-8601 calendar system, such as
2007-12-03T10:15:30+01:00 Europe/Paris
. - ZoneId: A time-zone ID, such as
Europe/Paris
. - ZoneOffset:A time-zone offset from Greenwich/UTC, such as
+02:00
.
LocalDateTime表示不带时区的时间,
ZonedDateTime是由LocalDateTime和时区ZoneId或者LocalDateTime和与格林标准时间的差ZoneOffset组成
使用
直接举例
// 字符串时间
String dateStr = "2020-01-22 19:30:00";
// 定义上海时区
ZoneId zoneShanghai = ZoneId.of("Asia/Shanghai");
// 标准时间+3小时
ZoneOffset zoneOffset = ZoneOffset.ofHours(3);
// 定义格式转换器
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 字符串时间转换为LocalDateTime格式
LocalDateTime localDateTime = LocalDateTime.from(formatter.parse(dateStr));
// 按上海时区定义ZonedDateTime时间
ZonedDateTime dateTime1 = ZonedDateTime.of(localDateTime,zoneShanghai);
// +3时区
ZonedDateTime dateTime2 = ZonedDateTime.of(localDateTime,zoneOffset);
// 日期转换,带时区
String time1 = formatter.withZone(zoneShanghai).format(dateTime1);
String time2 = formatter.withZone(zoneShanghai).format(dateTime2);
// time1 = "2020-01-22 19:30:00" , 对应的时区转换,日期没有问题
// time2 = "2020-01-23 00:30:00", 使用了上海时区(+8小时时区),结果为+5个小时时间
ZonedDateTime 和LocalDateTime 时间格式都可以很方便的是做时间操作,下面仅已LocalDateTime举例
// 加一天,一周,一月 ,判断两个日期
LocalDateTime newTime = localDateTime.plusDays(1L);
newDate = localDateTime.plusWeeks(1L);
newDate = localDateTime.plusMonths(1L);
localDateTime.isAfter(newDate); // false
// 获取周、月等信息
newDate.getDayOfWeek();
newDate.getMonth();