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

《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和LocalTime

LocalDate类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。

创建一个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 小结

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: