博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
日期和时间API - 读《Java 8实战》
阅读量:6989 次
发布时间:2019-06-27

本文共 7242 字,大约阅读时间需要 24 分钟。

  hot3.png

日期与时间

LocalDate

创建一个LocalDate对象并读取其值

// 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014System.out.println(date1.getMonth()); // MARCHSystem.out.println(date1.getMonth().getValue()); // 3System.out.println(date1.getDayOfMonth()); // 18System.out.println(date1.lengthOfMonth()); // 31System.out.println(date1.isLeapYear()); // false// 当前日期LocalDate now = LocalDate.now();System.out.println(now); // 2018-08-14// 从日期对象中获取年月日System.out.println(now.get(ChronoField.YEAR)); // 2018System.out.println(now.get(ChronoField.MONTH_OF_YEAR)); // 8System.out.println(now.get(ChronoField.DAY_OF_MONTH)); // 14

LocalTime

创建LocalTime并读取值

// 根据时分秒创建时间LocalTime time1 = LocalTime.of(13, 45, 20);System.out.println(time1.getHour()); // 13System.out.println(time1.getMinute()); // 45System.out.println(time1.getSecond()); // 20// 通过日期或时间字符串创建日期或时间LocalDate date2 = LocalDate.parse("2014-03-18");LocalTime time2 = LocalTime.parse("13:45:20");

LocalDateTime

直接创建LocalDateTime对象或通过合并日期和时间的方式创建

// 直接创建日期时间LocalDateTime lt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20);// 通过日期和时间创建LocalDate date1 = LocalDate.of(2014, 3, 18);LocalTime time1 = LocalTime.of(13, 45, 20);LocalDateTime lt2 = LocalDateTime.of(date1, time1);LocalDateTime lt3 = date1.atTime(13, 45, 20);LocalDateTime lt4 = date1.atTime(time1);LocalDateTime lt5 = time1.atDate(date1);// 从日期时间中提取日期和时间LocalDate date2 = lt1.toLocalDate();LocalTime time2 = lt1.toLocalTime();

Instant

机器的日期和时间格式

// 获取当前时刻时间戳System.out.println(Instant.now().toEpochMilli()); // 1534255959679

时间段

Duration & Period

Druation时间间隔单位是时分秒,Period时间间隔单位年月日

创建Duration和Period对象

LocalDate date1 = LocalDate.parse("2018-08-12");LocalDate date2 = LocalDate.parse("2018-08-11");LocalTime time1 = LocalTime.parse("12:45:20");LocalTime time2 = LocalTime.parse("12:45:21");Instant instant1 = Instant.ofEpochSecond(22);Instant instant2 = Instant.ofEpochSecond(11);// 时间间隔是时间秒Duration d2 = Duration.between(time1, time2); // time2 - time1Duration d3 = Duration.between(instant1, instant2); // instant2 - instant1Duration d4 = Duration.ofMinutes(3); // 创建一个3分钟的时间段System.out.println(d2.getSeconds()); // 1System.out.println(d4.getSeconds()); // 180// 时间间隔是年月日Period p1 = Period.between(date1, date2); // date2 - date1Period p2 = Period.ofDays(10);System.out.println(p1.getDays()); // -1System.out.println(p2.getDays()); // 10

操纵、解析和格式化日期

修改LocalDate对象属性

LocalDate date1 = LocalDate.of(2014, 3, 18);// 以比较直观的方式修改LocalDate date1 = date1.withYear(2011); // 修改年LocalDate date1 = date1.withMonth(11); // 修改月LocalDate date1 = date1.withDayOfMonth(25); // 修改日// 以相对方式修改date1.minusYears(1); // 减1年date1.plusYears(2); // 加2年date1.plus(3, ChronoUnit.MONTHS); // 加3月date1.plus(22, ChronoUnit.DAYS); // 加22天

TemporalAdjuster

LocalDate date1 = LocalDate.of(2014, 3, 18);// 当前日期之后包括当前日期的第一个星期日System.out.println(date1.with(nextOrSame(DayOfWeek.SUNDAY))); // 2014-03-23// 当月第一个星期日System.out.println(date1.with(firstInMonth(DayOfWeek.SUNDAY))); // 2014-03-02// 当月最后一个星期日System.out.println(date1.with(lastInMonth(DayOfWeek.SUNDAY))); // 2014-03-30// 当月第一天System.out.println(date1.with(firstDayOfMonth())); // 2014-03-01// 当月最后一天System.out.println(date1.with(lastDayOfMonth())); // 2014-03-31// 当年第一天System.out.println(date1.with(firstDayOfYear())); // 2014-01-01// 明年第一天System.out.println(date1.with(firstDayOfNextYear())); // 2015-01-01

定制一个TemopralAdjuster

求下一个工作日

当前日期如果是周日到周四,日期向后移1天 当前日期如果是周五或周六,日期移到下周一

方案一:实现一个TemporalAdjuster类

public class NextWorkingDay implements TemporalAdjuster {    @Override    public Temporal adjustInto(Temporal temporal) {        // 当前日期是周几        DayOfWeek dow =                DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));        // 判断要向后移几天        int dayToAdd = 1;        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;        return temporal.plus(dayToAdd, ChronoUnit.DAYS);    }}

方案二:直接使用Lambda使用

LocalDate nextWorkingDate = LocalDate.now()    .with(temporal -> {        // 当前日期是周几        DayOfWeek dow =            DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));        // 判断要向后移几天        int dayToAdd = 1;        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;        return temporal.plus(dayToAdd, ChronoUnit.DAYS);    });

方案三:使用Lambda实现一个TemporalAdjuster

TemporalAdjuster nextWorkingDay = TemporalAdjusters.ofDateAdjuster(    temporal -> {        // 当前日期是周几        DayOfWeek dow =            DayOfWeek.of(temporal.get(ChronoField.DAY_OF_WEEK));        // 判断要向后移几天        int dayToAdd = 1;        if (dow == DayOfWeek.FRIDAY) dayToAdd = 3;        else if (dow == DayOfWeek.SATURDAY) dayToAdd = 2;        return temporal.plus(dayToAdd, ChronoUnit.DAYS);    });

输出及解析日期时间对象

LocalDate date1 = LocalDate.of(2014, 3, 18);System.out.println(date1.format(DateTimeFormatter.BASIC_ISO_DATE)); // 20140318System.out.println(date1.format(DateTimeFormatter.ISO_LOCAL_DATE)); // 2014-03-18LocalDate date2 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);LocalDate date3 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);// 按照某个模式创建DateTimeFormatterDateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");System.out.println(date1.format(formatter)); // 2014/03/18LocalDate date4 = LocalDate.parse("2018/08/14", formatter);// 创建一个本地化的DateTimeFormatterDateTimeFormatter italianFormatter =    DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN);System.out.println(date1.format(italianFormatter)); // 18. marzo 2014LocalDate date5 = LocalDate.parse("18. marzo 2014", italianFormatter);

时区与历法

ZoneId

// 打印所有时区ZoneId.getAvailableZoneIds().stream()	.forEach(System.out::println);// 创建一个时区,格式为{区域}/{城市}ZoneId romeZone = ZoneId.of("Europe/Rome");// 将老的时区对象转换为ZoneIdZoneId newZoneId = TimeZone.getDefault().toZoneId();//  获取当前时区ZoneId defaultZoneId = ZoneId.systemDefault();System.out.println(defaultZoneId); // Asia/Shanghai

ZonedDateTime

为时间点添加时区信息

ZoneId romeZone = ZoneId.of("Europe/Rome");// 为时间点添加时区信息LocalDate date1 = LocalDate.now();ZonedDateTime zdt1 = date1.atStartOfDay(romeZone);LocalDateTime dateTime1 = LocalDateTime.now();ZonedDateTime zdt2 = dateTime1.atZone(romeZone);Instant instant1 = Instant.now();ZonedDateTime zdt3 = instant1.atZone(romeZone);// 将LocalDateTime转换为InstantInstant instantFromDateTime = dateTime1.toInstant(ZoneOffset.ofHours(0));// 将Instant转换为LocalDateTimeLocalDateTime dateTimeFromInstant = LocalDateTime.ofInstant(instant1, romeZone);

ZoneOffset

利用和UTC/格林尼治时间的固定偏差计算时区

// 不推荐使用// 纽约落后于伦敦5小时ZoneOffset newYorkOffset = ZoneOffset.of("-05:00");System.out.println(newYorkOffset);OffsetDateTime dateTimeInNewYork = OffsetDateTime.of(LocalDateTime.now(), newYorkOffset);

别的日历系统

ISO-8601日历系统是世界文明日历系统的事实标准。Java 8 还提供了4种其他日历系统,分别是

ThaiBuddhistDateMinguoDateJapaneseDateHijrahDate  // 伊斯兰教日历

所有这些类以及LocalDate都实现了ChronoLocalDate接口。

LocalDate date1 = LocalDate.now();JapaneseDate japaneseDate = JapaneseDate.from(date1);System.out.println(japaneseDate); // Japanese Heisei 30-08-14Chronology japaneseChronology = Chronology.ofLocale(Locale.JAPAN);ChronoLocalDate now = japaneseChronology.dateNow();System.out.println(now); // 2018-08-14

转载于:https://my.oschina.net/yysue/blog/1927992

你可能感兴趣的文章
禁用arcgis security service
查看>>
火狐ssl_error_weak_server_ephemeral_dh_key解决办法
查看>>
Exchange DAG error
查看>>
Windows7安全性的五件应该知道的事
查看>>
ON CONFLICT子句
查看>>
Delphi对保存数据库连接信息的Ini文件的操作类
查看>>
大数相加
查看>>
简单的nginx服务脚本
查看>>
现实社会做点事情真难~难~难~难
查看>>
Docker 完全指南
查看>>
自己建OpenERP群
查看>>
PHP汉字转换拼音http://blog.qita.in
查看>>
spring mvc 和声明式事务使用注意事项
查看>>
mysql启动时报错--ERROR! MySQL server PID file could not be found!
查看>>
linux多线程网页截图-python
查看>>
二叉树的性质
查看>>
Mysqlslap性能测试
查看>>
SQLmap使用tamper绕过WAF防火墙过滤
查看>>
无法连接SQL SERVER 2008 的问题
查看>>
魔饰的前世今生 – 体验攻略
查看>>