JDK1.8 时间日期组件

来源:互联网 发布:java环境变量配置linux 编辑:程序博客网 时间:2024/05/16 14:31

Instant

Instant本质上是一个数字时间戳,底层实际上是对System.currentTimeMillis()进行了包装。

Instant now = Instant.now();System.out.println(now.toString());// 毫秒System.out.println(now.get(ChronoField.MILLI_OF_SECOND));// 微秒,只是用毫秒数除以1000System.out.println(now.get(ChronoField.MICRO_OF_SECOND));// 纳秒,只是用毫秒数除以1000_000System.out.println(now.get(ChronoField.NANO_OF_SECOND));// 毫秒转InstantLocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());// 2018-06-16T23:12:01System.out.println(localDateTime);

LocalDate

LocalDate格式:2017-06-04,类似于java.sql.Date,不包含时间。1.8之前的java.lang.Date是包含时间的,所以从结构上看,1.8之前的设计有些糟糕。

// 获得当前日期LocalDate now = LocalDate.now();System.out.println(now.toString());// 日期加上1天LocalDate localDate2 = now.plusDays(1);System.out.println(localDate2.toString());// 日期加上一周LocalDate localDate3 = now.plusWeeks(1);System.out.println(localDate3);// 计算当前年的第52天是几月几号System.out.println("今年的第52天 = " + now.withDayOfYear(52));// 字符串转日期DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01");LocalDate date = LocalDate.from(dateTemporal);System.out.println(date);// 格式化日期DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");String dateStr = dateToStrFormatter.format(now);System.out.println(dateStr);
// 取当前日期:LocalDate today = LocalDate.now(); // -> 2014-12-24// 根据年月日取日期:LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25// 根据字符串取:LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式LocalDate.parse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date// 取本周周一:LocalDate today = LocalDate.now().with(DayOfWeek.MONDAY);// 取本月第1天:LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2017-03-01// 取本月第2天:LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2017-03-02// 取本月最后一天,再也不用计算是28,29,30还是31:LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2017-12-31// 取下一天:LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2018-01-01// 取2017年1月第一个周一,用Calendar要死掉很多脑细胞:LocalDate firstMondayOf2015 = LocalDate.parse("2017-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2017-01-02

LocalTime

LocalTime格式为13:01:02.221,在只需要处理时间的场景下,它变得非常有用。

LocalTime localTime = LocalTime.now();System.out.println("local time = " + localTime);System.out.println("plus 12 hours = " + localTime.plusHours(12));

LocalDateTime

LocalDateTime本质上有LocalDate和LocalTime组成。

// 获得当前日期时间LocalDateTime now = LocalDateTime.now();System.out.println(now);// 字符串转日期时间。DateTimeFormatter strToDateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");TemporalAccessor dateTemporal = strToDateFormatter.parse("2017-01-01 12:12:13");LocalDate date = LocalDate.from(dateTemporal);System.out.println(date);// 格式化日期时间DateTimeFormatter dateToStrFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");String dateStr = dateToStrFormatter.format(now);System.out.println(dateStr);

Period

Period代表的是两个日期之间的天、月、年数差值,当然,我们也可以直接使用日期中的until方法来完成同样的效果。

LocalDate startDate = LocalDate.now();LocalDate endDate = startDate.plusDays(1);Period period = Period.between(startDate, endDate);System.out.println("间隔的天数" + period.getDays());System.out.println("间隔的月数:" + period.getMonths());System.out.println("间隔的年数:" + period.getYears());// 直接使用日期类中的方法计算日期间隔long days = startDate.until(endDate, ChronoUnit.DAYS);System.out.println("间隔的天数:" + days);long weeks = startDate.until(endDate, ChronoUnit.WEEKS);System.out.println("间隔的周数:" + weeks);

Duration

Duration表示的是两个日期时间间隔的秒以及纳秒数。

LocalDateTime start = LocalDateTime.now();LocalDateTime end = start.plusDays(1);Duration duration = Duration.between(start, end);System.out.println("间隔的秒数:" + duration.get(ChronoUnit.SECONDS));System.out.println("间隔的纳秒数:" + duration.get(ChronoUnit.NANOS));
原创粉丝点击