java8中引入新的日期时间API,主要解决原来日期操作复杂,表示不清晰,线程不安全等问题。
//指定日期创建
LocalDate date = LocalDate.of(2019, 10, 20);
System.out.println(date.getYear()); //2019
System.out.println(date.getMonth().getValue()); //10
System.out.println(date.getDayOfMonth());//20
System.out.println(date.isLeapYear());//是否是闰年:false
//获取当前日期
LocalDate date = LocalDate.now();
//使用TemporalField读取LocalDate的值
System.out.println(date.get(ChronoField.YEAR));
System.out.println(date.get(ChronoField.MONTH_OF_YEAR));
System.out.println(date.get(ChronoField.DAY_OF_MONTH));
//指定时间创建
LocalTime time = LocalTime.of(18, 10, 58);
System.out.println(time.getHour());//18
System.out.println(time.getMinute());//10
System.out.println(time.getSecond());//58
//获取当前时间
LocalTime time = LocalTime.now();
//使用TemporalField读取LocalTime的值
System.out.println(time.get(ChronoField.HOUR_OF_DAY));
System.out.println(time.get(ChronoField.MINUTE_OF_HOUR));
System.out.println(time.get(ChronoField.SECOND_OF_MINUTE));
LocalDate和LocalTime都可以通过解析代表它们的字符串创建。使用静态方法parse进行解析。
LocalDate date = LocalDate.parse("2019-10-20");
LocalTime time = LocalTime.parse("18:10:58");
LocalDateTime,是LocalDate和LocalTime的合体。它同时表示了日期 和时间,但不带有时区信息,可以直接创建,也可以通过合并日期和时间对象构造。
LocalDateTime dt1 = LocalDateTime.of(2019, 10, 20, 18, 10, 58);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(time);
LocalDateTime dt4 = time.atDate(date);
从LocalDateTime获取LocalDate或LocalTime
LocalTime time1 = dt1.toLocalTime();
LocalDate date1 = dt1.toLocalDate();
如果你已经有一个LocalDate对象,想要创建它的一个修改版,最直接也最简单的方法是使用withAttribute方法。withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。注意,下面的这段代码中所有的方法都返回一个修改了属性的对象。它们都不会修改原来的对象!
LocalDate date1 = LocalDate.of(2019, 10, 20);
LocalDate date2 = date1.withYear(2020);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 9);
System.out.println(date1.toString());//2019-10-20
System.out.println(date2);//2020-10-20
System.out.println(date3);//2020-10-25
System.out.println(date4);//2020-09-25
LocalDate date1 = LocalDate.of(2019, 10, 20);
LocalDate date2 = date1.plusYears(1);
LocalDate date3 = date2.minusMonths(1);
LocalDate date4 = date3.plusDays(5);
System.out.println(date1.toString());//2019-10-20
System.out.println(date2);//2020-10-20
System.out.println(date3);//2020-09-20
System.out.println(date4);//2020-09-25
方法名 | 是否是静态方法 | 描述 |
---|---|---|
from | 是 | 依据传入的 Temporal 对象创建对象实例 |
now | 是 | 依据系统时钟创建 Temporal 对象 |
of | 是 | 由Temporal对象的某个部分创建该对象的实例 |
parse | 是 | 由字符串创建Temporal对象的实例 |
atOffset | 否 | 将Temporal对象和某个时区偏移相结合 |
atZone | 否 | 将Temporal 对象和某个时区相结合 |
format | 否 | 使用某个指定的格式器将Temporal对象转换为字符串(Instant类不提供该方法) |
get | 否 | 读取 Temporal 对象的某一部分的值 |
minus | 否 | 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值减去一定的时长 创建该副本 |
plus | 否 | 创建 Temporal 对象的一个副本,通过将当前 Temporal 对象的值加上一定的时长 创建该副本 |
with | 否 | 以该Temporal对象为模板,对某些状态进行修改创建该对象的副本 |
//使用默认格式
LocalDate date = LocalDate.of(2019, 10, 20);
String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); //20191020
String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); //2019-10-20
//使用自定义格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd");
String s1 = date.format(formatter);
String s2 = date.format(formatter2);
System.out.println(s1);//20/10/2019
System.out.println(s2);//2019:10:20
LocalDate date2 = LocalDate.parse(s2, DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date2);//2019-10-20
LocalDateTime date = LocalDateTime.of(2019, 10, 20, 18, 10, 58);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss");
String s1 = date.format(formatter);
String s2 = date.format(formatter2);
System.out.println(s1);//2019年10月20日 18时10分58秒
System.out.println(s2);//2019:10:20 18:10:58
LocalDateTime date2 = LocalDateTime.parse(s2, formatter2);
System.out.println(date2);//2019-10-20T18:10:58
新的java.time.ZoneId 类是老版java.util.TimeZone的替代品
获取当前时区
ZoneId zoneId = ZoneId.systemDefault();
System.out.println(zoneId);
ZoneId test = ZoneId.of("America/New_York");
LocalDateTime dateTime = LocalDateTime.now();
LocalDateTime ldt = LocalDateTime.now(test);
ZonedDateTime zdt = dateTime.atZone(test);
System.out.println(dateTime);//2019-10-20T19:31:52.186
System.out.println(ldt);//2019-10-20T07:31:52.186
相关链接:
java8中map新增方法详解
java8中Stream的使用
java8中Collection新增方法详解
java8中Collectors的方法使用实例
java8中常用函数式接口
java8中的方法引用和构造函数引用
java8中的Collectors.groupingBy用法
java8中的Optional用法
java8中的日期和时间API