ZoneId: 时区ID,用来确定 Instant 和 LocalDateTime 互相转换的规则
Instant: 用来表示时间线上的一个点(瞬时)
LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
Clock: 用于访问当前时刻、日期、时间,用到时区
Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
Period: 用于计算两个“日期”间隔
其中,LocalDate、LocalTime、LocalDateTime是新API里的基础对象,绝大多数操作都是围绕这几个对象来进行的,有必要搞清楚:
LocalDate : 只含年月日的日期对象
LocalTime :只含时分秒的时间对象
LocalDateTime : 同时含有年月日时分秒的日期对象
只对年月日做出处理
// 获取今天的日期 LocalDate today = LocalDate.now(); // 今天是几号 int dayofMonth = today.getDayOfMonth(); // 今天是周几(返回的是个枚举类型,需要再getValue()) int dayofWeek = today.getDayOfWeek().getValue(); // 今年是哪一年 int dayofYear = today.getDayOfYear(); // 根据字符串取: LocalDate endOfFeb = LocalDate.parse("2018-02-28"); // 严格按照yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式 //TemporalAdjusters里面有更多的特殊日期,诸如一年的第一天(好像并没什么用),一个月的第一天等等 // 取本月第1天: LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2018-04-01 // 取本月第2天: LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2018-04-02 // 取本月最后一天,再也不用计算是28,29,30还是31: LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2018-04-30 // 取下一天: LocalDate firstDayOfNextMonth = lastDayOfThisMonth.plusDays(1); // 变成了2018-05-01 // 取2017年1月第一个周一: LocalDate firstMondayOf2017 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02
只对时分秒纳秒做出处理
LocalTime只包含时间
// 获得当前时间,包含毫秒 LocalTime now = LocalTime.now(); // 清除毫秒数 LocalTime now = LocalTime.now().withNano(0)); // 00:00:00 LocalTime zero = LocalTime.of(0, 0, 0); // 12:00:00 LocalTime mid = LocalTime.parse("12:00:00");
构造时间是按照 ISO 格式识别,可以识别以下3种格式:
12:00
12:01:02
12:01:02.345
//计算两个日期的日期间隔-年月日 LocalDate date1 = LocalDate.of(2018, 2, 13); LocalDate date2 = LocalDate.of(2017, 3, 12); //内部是用date2-date1,所以得到的结果是负数 Period period = Period.between(date1, date2); System.out.println("相差年数 : " + period.getYears()); System.out.println("相差月数 : " + period.getMonths()); System.out.println("相差日数 : " + period.getDays()); //还可以这样获取相差的年月日 System.out.println("-------------------------------"); long years = period.get(ChronoUnit.YEARS); long months = period.get(ChronoUnit.MONTHS); long days = period.get(ChronoUnit.DAYS); System.out.println("相差的年月日分别为 : " + years + "," + months + "," + days); //注意,当获取两个日期的间隔时,并不是单纯的年月日对应的数字相加减,而是会先算出具体差多少天,在折算成相差几年几月几日的 //计算两个时间的间隔 System.out.println("-------------------------------"); LocalDateTime date3 = LocalDateTime.now(); LocalDateTime date4 = LocalDateTime.of(2018, 1, 13, 22, 30, 10); Duration duration = Duration.between(date3, date4); System.out.println(date3 + " 与 " + date4 + " 间隔 " + "\n" + " 天 :" + duration.toDays() + "\n" + " 时 :" + duration.toHours() + "\n" + " 分 :" + duration.toMinutes() + "\n" + " 毫秒 :" + duration.toMillis() + "\n" + " 纳秒 :" + duration.toNanos() + "\n" ); //注意,并没有获得秒差的,但既然可以获得毫秒,秒就可以自行获取了
Instant start = Instant.now(); for (int i = 0; i < 1000000; i++) { } Instant end = Instant.now(); Duration duration = Duration.between(start, end); System.out.println("运行耗时:" + duration.toMillis() + " 毫秒");
LocalDate 的格式化不要用 SimpleDateFormat 的方法。
LocalDate today = LocalDate.now(); DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); String text = today.format(formatters);
需要使用 DateTimeFormatter 来构造格式化模板,然后使用 format 方法,返回的是 String 类型。