JDK1.8 时间日期组件

Instant

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

Instant now = Instant.now();
System.out.println(now.toString());
// 毫秒
System.out.println(now.get(ChronoField.MILLI_OF_SECOND));
// 微秒,只是用毫秒数除以1000
System.out.println(now.get(ChronoField.MICRO_OF_SECOND));
// 纳秒,只是用毫秒数除以1000_000
System.out.println(now.get(ChronoField.NANO_OF_SECOND));
// 毫秒转Instant
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// 2018-06-16T23:12:01
System.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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值