您的位置:首页 > 编程语言 > Java开发

jdk1.8日期时间组件

2017-06-04 14:09 585 查看

jdk1.8日期时间组件

注:个人学习笔记,不保证正确性

参考文献:Java Date-Time Packages

jdk8引入了全新的日期和时间组件,并把它们归纳到一系列的包下。核心包java.time使用的历法采用ISO-8601标准,当然,我们也可以使用java.time.chrono包中的一些非标准的历法,比如日本帝国历法(天皇年号)、泰国佛教历法(佛陀诞生)、中华民国历法(辛亥革命)、伊斯兰黑蚩拉历法。java.time.format提供日期的格式化和转换。注意,新的API操作都是线程安全的,因为新的日期API类都是final修饰而不可变的,如果遇到加减运算及格式化操作,本质上会创建新的实例。

java.time包内,有几个比较重要的组件,Instant(时间戳);LocalDate(日期);LocalDate(时间);LocalDateTime(日期时间);ZonedDateTime(带有区域信息的日期时间,比如中国默认使用的是东八区)。Period(如两个日期之间相差的天数);Druation(两个日期时间之间间隔的秒和纳秒)。

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);


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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java