Java 8的日期和时间类包含 LocalDate、LocalTime、Instant、Duration 以及 Period,这些类都包含在 java.time 包中,Java 8 新的时间API的使用方式,包括创建、格式化、解析、计算、修改。
LocalDate 只会获取年月日
public static void main(String[] args) {
//获取当前年月日
LocalDate localDate = LocalDate.now();
//获取年份
int year = localDate.getYear();
int year1 = localDate.get(ChronoField.YEAR);
//获取月份(英文)
Month month = localDate.getMonth();
//获取月份(阿拉布数字)
int i = localDate.get(ChronoField.MONTH_OF_YEAR);
//今天是几号
int dayOfMonth = localDate.getDayOfMonth();
//今天周几
DayOfWeek dayOfWeek = localDate.getDayOfWeek();
//今天是今年的第几天
int dayOfYear = localDate.getDayOfYear();
}
LocalTime 只会获取时分秒
//获取当前时分秒
LocalTime localTime = LocalTime.now();
//获取当前小时
int hour = localTime.getHour();
int hour1 = localTime.get(ChronoField.CLOCK_HOUR_OF_DAY);
//获取当前分钟
int minute = localTime.getMinute();
int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
//获取当前秒数
int second = localTime.getSecond();
int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);
LocalDateTime 获取年月日时分秒,相当于 LocalDate + LocalTime
//获取当前时间的年月日时分秒
LocalDateTime localDateTime = LocalDateTime.now();
LocalDateTime localDateTime1 = LocalDateTime.of(localDate, localTime);
LocalDateTime localDateTime2 = localDate.atTime(localTime);
LocalDateTime localDateTime3 = localTime.atDate(localDate);
//获取指定时间的年月日时分秒
LocalDateTime localDateTime4 = LocalDateTime.of(2021, Month.OCTOBER, 10, 14, 17, 56);
//获取年份
int year = localDateTime.getYear();
int year1 = localDateTime.get(ChronoField.YEAR);
//获取月份(英文)
Month month = localDateTime1.getMonth();
//获取月份(阿拉伯数字)
int month1 = localDateTime1.get(ChronoField.MONTH_OF_YEAR);
//获取今天是今年的第几天
int dayOfYear = localDateTime2.getDayOfYear();
//获取今天是几号
int dayOfMonth = localDateTime3.getDayOfMonth();
//获取今天是周几
DayOfWeek dayOfWeek = localDateTime4.getDayOfWeek();
Instant 获取秒数,用于表示一个时间戳(精确到纳秒)
//创建 instant 对象
Instant instant = Instant.now();
//1970-01-01T00:00:00Z 到现在的秒数
long currentSecond = instant.getEpochSecond();
//1970-01-01T00:00:00Z 到现在的毫秒数
long currentMilli = instant.toEpochMilli();
//获取从秒开始后沿时间线的纳秒数。纳秒-秒值度量从getEpochSecond返回的秒开始的纳秒总数.但不超过999,999,999
int nano = instant.getNano();
Duration 表示一个时间段
//定义开始时间和结束时间
LocalDateTime from = LocalDateTime.of(1998, 4, 8,0,0,0);
LocalDateTime to = LocalDateTime.of(2021, 10, 8,0,0,0);
//只支持 ’秒‘ 时间单位
Duration between = Duration.between(from, to);
//这段时间的总天数
long days = between.toDays();
//这段时间的总小时数
long hours = between.toHours();
//这段时间的总分钟数
long minutes = between.toMinutes();
//这段时间的总秒数
long seconds = between.getSeconds();
//这段时间的毫秒数
long millis = between.toMillis();
//这段时间的纳秒数
long nanos = between.toNanos();
修改 LocalDate、LocalTime、LocalDateTime、Instant。
LocalDate、LocalTime、LocalDateTime、Instant 为不可变对象,修改这些对象对象会返回一个副本。
增加、减少年数、月数、天数等,以LocalDate为例:
LocalDate localDate = LocalDate.of(2000,3,1);
//修改年份(增加)
localDate = localDate.plusYears(2); //2002年
localDate = localDate.plus(1, ChronoUnit.YEARS); //2003年
//修改月份(减少)
localDate = localDate.minusMonths(1); //2003-2
localDate = localDate.minus(2,ChronoUnit.MONTHS); //2002-12
// 通过with修改某些值
// 修改年为2020
localDate = localDate.withYear(2020);
localDate = localDate.with(ChronoField.YEAR, 2020);
// 时间计算
// 获取该年的第一天
LocalDate localDate1 = localDate.with(firstDayOfYear());
// 获取该年的最后一天
LocalDate localDate2 = localDate.with(lastDayOfYear());
TemporalAdjusters 包含许多静态方法,可以直接调用,以下列举一些:
方法名 | 描述 |
---|---|
dayOfWeekInMonth | 返回同一个月中每周的第几天 |
firstDayOfMonth | 返回当月的第一天 |
firstDayOfNextMonth | 返回下月的第一天 |
firstDayOfNextYear | 返回下一年的第一天 |
firstDayOfYear | 返回本年的第一天 |
firstInMonth | 返回同一个月中第一个星期几 |
lastDayOfMonth | 返回当月的最后一天 |
lastDayOfNextMonth | 返回下月的最后一天 |
lastDayOfNextYear | 返回下一年的最后一天 |
lastDayOfYear | 返回本年的最后一天 |
lastInMonth | 返回同一个月中最后一个星期几 |
next / previous | 返回后一个/前一个给定的星期几 |
nextOrSame / previousOrSame | 返回后一个/前一个给定的星期几,如果这个值满足条件,直接返回 |
演示一下用法
// 当前时间为2019-09-01 11:17:24
// 2019-09-01
LocalDate.now().with(TemporalAdjusters .firstDayOfMonth());
// 2019-01-01T11:17:24.070
LocalDateTime.now().with(TemporalAdjusters .firstDayOfYear());
格式化时间
LocalDate localDate = LocalDate.of(2019, 9, 12);
String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE);
// 自定义格式化
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String s3 = localDate.format(dateTimeFormatter);
解析时间
LocalDate localDate1 = LocalDate.parse("20190912", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate localDate2 = LocalDate.parse("2019-09-12", DateTimeFormatter.ISO_LOCAL_DATE);
总结
- 和 SimpleDateFormat 相比,DateTimeFormatter 是线程安全的。
- Instant 的精确度更高,可以精确到纳秒级。
- Duration 可以便捷得到时间段内的天数、小时数等。
- LocalDateTime 能够快速地获取年、月、日、下一月等。
- TemporalAdjusters 类中包含许多常用的静态方法,避免自己编写工具类。