java时间

  • Post author:
  • Post category:java




jdk8以前

Date 保存了时间戳,可以确定一个时刻,无时区信息

Calendar 保存了时间戳和时区,可以确定一个时刻,另外有一些方便的操作

TimeZone 时区

SimpleDateFormat 格式化/解析Date(字符串带时区才能确定一个时刻,才是有意义的;不带时区解析出来的Date,其实是使用了默认时区)



jkd8新增

Instant 时间戳,时刻

LocalDateTime 不带时区,无法确定一个时刻

ZonedDateTime 带时区和时间戳,可以确定一个时刻

ZoneId 时区

DateTimeFormatter 格式化/解析LocalDateTime、ZonedDateTime



相互转换

Date对应Instant

Instant ins1 = new Date().toInstant();
Date date = new Date(Instant.now().toEpochMilli())

Calendar 对应ZonedDateTime

// Calendar -> Instant -> ZonedDateTime:
Calendar calendar = Calendar.getInstance();
Instant ins2 = calendar.toInstant();
ZonedDateTime zdt = ins2.atZone(calendar.getTimeZone().toZoneId());

// ZonedDateTime -> Instant -> Calendar 
ZonedDateTime zdt = ZonedDateTime.now();
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeZone(TimeZone.getTimeZone(zdt.getZone().getId()));
calendar.setTimeInMillis(zdt.toInstant().toEpochMilli());

LocalDateTime转ZonedDateTime,需要带上时区(注意有夏令时的影响,会自动调整结果)

// 进入夏令时,凌晨两点往后拨一小时,因此2点31是不存在的,自动往后加一小时变成"2023-03-12T03:31-04:00[America/New_York]"
 LocalDateTime localDateTime1 = LocalDateTime.of(2023, 3, 12, 2, 31, 00);
 ZonedDateTime zonedDateTime1 = ZonedDateTime.of(localDateTime1, ZoneId.of("America/New_York"));

// 正常的处于夏令时的某一天"2023-03-12T04:31-04:00[America/New_York]"
LocalDateTime localDateTime2 = LocalDateTime.of(2023, 3, 12, 4, 31, 00);
ZonedDateTime zonedDateTime2 = ZonedDateTime.of(localDateTime2, ZoneId.of("America/New_York"));


// 正常的处于冬令时的某一天"2022-12-12T04:31-05:00[America/New_York]"
LocalDateTime localDateTime3 = LocalDateTime.of(2022, 12, 12, 4, 31, 00);
ZonedDateTime zonedDateTime3 = ZonedDateTime.of(localDateTime2, ZoneId.of("America/New_York"));



版权声明:本文为biglamp原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。