可以取代System.currentTimeMillis()
,时区敏感,带有时区信息
Clock clock = Clock.systemDefaultZone();long millis = clock.millis();Instant instant = clock.instant();Date legacyDate = Date.from(instant); // legacy java.util.Date
新的时区类 java.time.ZoneId
是原有的 java.util.TimeZone
类的替代品。 ZoneId 对象可以通过 ZoneId.of()
方法创建,也可以通过 ZoneId.systemDefault()
获取系统默认时区。
System.out.println(ZoneId.getAvailableZoneIds());// prints all available timezone idsZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");// ZoneRules[currentStandardOffset=+08:00]
有了 ZoneId,我们就可以将一个 LocalDate、LocalTime 或 LocalDateTime 对象转化为 ZonedDateTime 对象
LocalDateTime localDateTime = LocalDateTime.now();ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, shanghaiZoneId);
ZonedDateTime 对象由两部分构成,LocalDateTime 和 ZoneId,其中 2018-03-03T15:26:56.147 部分为 LocalDateTime,+08:00[Asia/Shanghai] 部分为 ZoneId。
LocalTime 类是 Java 8 中日期时间功能里表示一整天中某个时间点的类,它的时间是无时区属性的(早上 10 点等等)
LocalTime now1 = LocalTime.now(zone1);LocalTime now2 = LocalTime.now(zone2);System.out.println(now1.isBefore(now2)); // falselong hoursBetween = ChronoUnit.HOURS.between(now1, now2);long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);System.out.println(hoursBetween); // -3System.out.println(minutesBetween); // -239
LocalDate 类是 Java 8 中日期时间功能里表示一个本地日期的类,它的日期是无时区属性的。 可以用来表示生日、节假日期等等。这个类用于表示一个确切的日期,而不是这个日期所在的时间
LocalDate today = LocalDate.now();LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);LocalDate yesterday = tomorrow.minusDays(2);LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();System.out.println(dayOfWeek); // FRIDAY
LocalDateTime 类是 Java 8 中日期时间功能里,用于表示当地的日期与时间的类,它的值是无时区属性的。你可以将其视为 Java 8 中 LocalDate 与 LocalTime 两个类的结合。
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59);DayOfWeek dayOfWeek = sylvester.getDayOfWeek();System.out.println(dayOfWeek); // WEDNESDAYMonth month = sylvester.getMonth();System.out.println(month); // DECEMBERlong minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);System.out.println(minuteOfDay); // 1439
ZonedDateTime 类是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类。可以用于表示一个真实事件的开始时间,如某火箭升空时间等等。
ZonedDateTime dateTime = ZonedDateTime.now();ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.now(), shanghaiZoneId);
转时间戳
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2022-10-15T02:55:38.776Z");System.out.println(zonedDateTime.toInstant().toEpochMilli());
一个 Duration 对象表示两个 Instant 间的一段时间
Instant first = Instant.now();// wait some time while something happensInstant second = Instant.now();Duration duration = Duration.between(first, second);
DateTimeFormatter 类是 Java 8 中日期时间功能里,线程安全。用于解析和格式化日期时间的类 。类中包含如下预定义的实例:
BASIC_ISO_DATEISO_LOCAL_DATEISO_LOCAL_TIMEISO_LOCAL_DATE_TIMEISO_OFFSET_DATEISO_OFFSET_TIMEISO_OFFSET_DATE_TIMEISO_ZONED_DATE_TIMEISO_INSTANTISO_DATEISO_TIMEISO_DATE_TIMEISO_ORDINAL_TIMEISO_WEEK_DATERFC_1123_DATE_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;//DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formattedDate = formatter.format(LocalDateTime.now());
UTC时区转PST时区
public static String getPstTime(String utc) {private static DateTimeFormatter zone_formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");ZonedDateTime utcTime = ZonedDateTime.parse(utc);ZonedDateTime pst = utcTime.withZoneSameInstant(ZoneId.of("America/Los_Angeles"));return zone_formatter.format(pst);}