文章目录
前言
Java 8以前的日期和时间API,主要的类是Date和Calendar,由于它的设计有一些不足,Java 8引入了一套新的API,位于包java.time下。
一、表示日期和时间
Java 8中表示日期和时间的类有多个,主要的有:
❑ Instant:表示时刻
,不直接对应年月日信息,需要通过时区转换;
❑ LocalDateTime:表示与时区无关的日期和时间,不直接对应时刻,需要通过时区转换;
❑ ZoneId/ZoneOffset:表示时区
;
❑ LocalDate:表示与时区无关的日期,与LocalDateTime相比,只有日期,没有时间信息;
❑ LocalTime:表示与时区无关的时间,与LocalDateTime相比,只有时间,没有日期信息;
❑ ZonedDateTime:表示特定时区的日期和时间。
1. Instant
Instant表示时刻,获取当前时刻,代码为:
Instant now = Instant.now(); // 获取当前时刻
System.out.println(now); // 2024-01-30T07:08:21.837Z
Instant now2 = Instant.ofEpochMilli(System.currentTimeMillis()); // 根据Epoch Time(纪元时)创建Instant
System.out.println(now2); // 2024-01-30T07:08:21.884Z
Date也表示时刻,Instant和Date可以通过纪元时相互转换
Date date = new Date();
Instant instant = Instant.ofEpochMilli(date.getTime()); // 转换Date为Instant
Date date1 = new Date(instant.toEpochMilli()); // 转换Instant为Date
2. LocalDateTime
LocalDateTime表示与时区无关的日期和时间
LocalDateTime ldt = LocalDateTime.now();
LocalDateTime ldt2 = LocalDateTime.of(2017, 7, 11, 20, 45, 5);
int year = ldt2.getYear();//2017
int monthValue = ldt2.getMonthValue();// 7
int dayOfMonth = ldt2.getDayOfMonth();// 11
int hour = ldt2.getHour();// 20
int minute = ldt2.getMinute();// 45
int second = ldt2.getSecond();// 5
Month month = ldt2.getMonth();// JULY
DayOfWeek dayOfWeek = ldt2.getDayOfWeek();// TUESDAY
System.out.println(ldt2);// 2017-07-11T20:45:05
3. ZoneId/ZoneOffset
ZoneOffset是ZoneId的子类,可以根据时区差构造。
LocalDateTime不能直接转为时刻Instant,转换需要一个参数ZoneOffset, ZoneOffset表示相对于格林尼治的时区差,北京是+08:00。
LocalDateTime ldt = LocalDateTime.now();
Instant instant = ldt.toInstant(ZoneOffset.of("+08:00"));
System.out.println(instant); // 2024-01-30T07:42:17.358Z
// ZoneId zone = ZoneId.systemDefault();
ZoneId zone = ZoneId.of("GMT+08:00");//北京时区