《Java in Action》-1 第12章 新的日期和时间API
2016-10-18 23:09
405 查看
第12章 新的日期和时间API
12.1 LocalDate、LocalTime、Instant、Duration以及Period
12.1.1 使用LocalDate和LocalTimeLocalDate类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。
创建一个LocalDate对象并读取其值:
LocalDate date = LocalDate.of(2014, 3, 18);
int year = date.getYear(); // 2014
Month month = date.getMonth(); // MARCH
int day = date.getDayOfMonth(); // 18
DayOfWeek dow = date.getDayOfWeek(); // TUESDAY
int len = date.lengthOfMonth(); // 31 (days in March)
boolean leap = date.isLeapYear(); // false (not a leap year)
System.out.println(date);
可以使用工厂方法从系统时钟中获取当前的日期:
LocalDate today = LocalDate.now();
TemporalField是一个接口,它定义了如何访问temporal对象某个字段的值。ChronoField枚举实现了这一接口,所以你可以很方便地使用get方法得到枚举元素的值:
int y = date.get(ChronoField.YEAR);
int m = date.get(ChronoField.MONTH_OF_YEAR);
int d = date.get(ChronoField.DAY_OF_MONTH);
LocalTime类表示一天中的时间:
LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20
int hour = time.getHour(); // 13
int minute = time.getMinute(); // 45
int second = time.getSecond(); // 20
System.out.println(time);
LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse,你可以实现这一目的:
LocalDate date = LocalDate.parse("2014-03-18");
LocalTime time = LocalTime.parse("13:45:20");
12.1.2 合并日期和时间
直接创建LocalDateTime对象,或者通过合并日期和时间的方式创建:
LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); // 2014-03-18T13:45
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);
System.out.println(dt1);
提取日期和时间:
LocalDate date1 = dt1.toLocalDate();
System.out.println(date1);
LocalTime time1 = dt1.toLocalTime();
System.out.println(time1);
12.1.3 机器的日期和时间格式
Instant类对时间建模的方式,基本上它是以Unix元年时间开始所经历的秒数进行计算。
通过向静态工厂方法ofEpochSecond传递一个代表秒数的值创建一个该类的实例。
Instant instant = Instant.ofEpochSecond(44 * 365 * 86400);
也支持静态工厂方法now,能够帮你获取当前时刻的时间戳。
Instant now = Instant.now();
12.1.4 定义Duration或Period
Duration d1 = Duration.between(LocalTime.of(13, 45, 10), time);
Duration d2 = Duration.between(instant, now);
System.out.println(d1.getSeconds());
System.out.println(d2.getSeconds());
Duration threeMinutes = Duration.of(3, ChronoUnit.MINUTES);
System.out.println(threeMinutes);
JapaneseDate japaneseDate = JapaneseDate.from(date);
System.out.println(japaneseDate);
12.2 操纵、解析和格式化日期
如果已经有一个LocalDate对象,想要修改它的一个修改版,使用withAttribute方法,withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。以比较直观的方式操纵LocalDate的属性:
LocalDate date1 = LocalDate.of(2014,3,18);//2014-03-18
LocalDate date2 = date1.withYear(2011);//2011-03-18
LocalDate date3 = date1.withDayofMonth(25);//2011-03-25
LocalDate date4 = date1.with(ChronoField.MONTH_OF_YEAR,9); //2011-09-25
以相对方式修改LocalDate对象的属性:
LocalDate date1 = LocalDate.of(2014,3,18);//2014-03-18
LocalDate date2 = date1.plusWeeks(1);//2014-03-25
LocalDate date3 = date2.minusYears(3);//2011-03-25
LocalDate date4 = date3.plus(6,ChronoUnit.MONTHS);//2011-09-25
12.2.1 使用TemporalAdjuster
可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更加灵活地处理日期。
例子:
LocalDate date1 = LocalDate.of(2014,3,18);
LocalDate date2 = date1.with(TemporalAdjuster.lastDayofMonth()); //2014-03-31
12.2.2 打印输出及解析日期-时间对象
LocalDate date = LocalDate.of(2014,3,18);
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20140318
LocalDate date1 = LocalDate.parse("20140318",DateTimeFormatter.BASIC_ISO_DATE);
按照某个模式创建DateTimeFormatter:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
12.3 处理不同的时区和历法
ZoneId类让你无需为时区处理的复杂和繁琐而操心。ZoneId zoneId = ZoneId.of("Europe/Rome");
12.4 小结
相关文章推荐
- Java 8 日期/时间(Date Time)API指南
- Java中日期时间API小结
- Java8 日期/时间(Date Time)API指南
- Java8:新的日期和时间API
- Java8 日期时间API
- Java 8时间和日期API 20例
- Java8 日期/时间(Date Time)API指南
- 【转】JAVA 8 日期/时间(Date Time)API指南
- Java 8新特性之新的时间日期API
- JAVA 8 新日期和时间API 学习总结
- Java 8时间和日期API 20例
- Java 8时间和日期API 20例
- Java 8时间和日期API 20例
- [转载]Java 8 日期&时间 API
- Java 8新的日期与时间API
- Java8 日期/时间(Date Time)API指南
- Java8中新增的日期和时间API
- java parse 带英文单词的日期字符串(转化新浪微博api返回的时间)
- java8 新的日期和时间api
- Android 系列 2.11使用Java 8 java.time API简化日期/时间计算