1.java.time提供了新的日期和时间API:
- LocalDate/LocalTime/LocalDateTime
- ZoneDateTime/ZoneId
- Instant
- Formatter
新API特点:
- 严格区分日期、时间
- 所有的类均为不变类(类似String)
- 修复了Month范围1-12(Jan~Dec)
- Week范围1-7(Mon~Sun)
2.LocalDate/LocalTime/LocalDateTime
- LocalDate:本地日期
- LocalTime:本地时间
- LocalDateTime:本地日期+时间
public static void main(String[] args) { //获取当前日期时间 LocalDate d = LocalDate.now();//获取当前日期 LocalTime t = LocalTime.now();//当去当前时间 LocalDateTime dt = LocalDateTime.now();//获取当前日期和时间 //Local严格按照ISO 8601格式打印 System.out.println(d+"\t"+t+"\t"+dt); //指定日期时间 LocalDate d2 = LocalDate.of(2016,11,30);//构造LocalDate对象,月份不再减1,即11是11月,不是12月 LocalTime t2 = LocalTime.of(15,16,17);//构造LocalTime对象 LocalDateTime dt2 = LocalDateTime.of(2016,11,30,15,16,17);//构造LocalDateTime对象 LocalDateTime dt3 = LocalDateTime.of(d2,t2);//根据LocalDate和LocalTime对象构造LocalDateTime对象 System.out.println(d2+"\t"+t2+"\t\t"+dt2); }
2.1DateTimeFormatter是不可变类
public static void main(String[] args) { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); System.out.println(dtf.format(LocalDateTime.now())); System.out.println(LocalDateTime.now().format(dtf)); LocalDateTime dt2 = LocalDateTime.parse("2019-04-11 19:27:18",dtf); System.out.println(dt2); }
3.parse将字符串解析为日期时间
默认是按照ISO标准格式进行解析的。如果传入的标准格式的日期、时间,可以自动解析。
- yyyy-MM-dd
- HH:mm:ss
- HH:mm:ss:SSS
- yyyy-MM-dd'T'HH:mm:ss
- yyyy-MM-dd'T'HH:mm:ss.SSS
public static void main(String[] args) { LocalDate d1 = LocalDate.parse("2001-05-06"); System.out.println(d1); LocalTime t1 = LocalTime.parse("15:16:17"); System.out.println(t1); LocalTime t2 = LocalTime.parse("15:16:17.99"); System.out.println(t2); LocalDateTime dt1 = LocalDateTime.parse("2016-11-30T15:16:17"); System.out.println(dt1); LocalDateTime dt2 = LocalDateTime.parse("2016-11-30T15:16:17.333"); System.out.println(dt2); }
4.日期和时间运算
4.1对日期和时间进行加减
- plusDays()
- minusHours()
- plusWeeks()
public static void main(String[] args) { LocalDate today = LocalDate.now(); LocalDate after5days = today.plusDays(5);//加5天 System.out.println(today+"\t"+after5days); LocalTime now = LocalTime.now(); LocalTime before2hours = now.minusHours(2);//减2小时 System.out.println(now+"\t"+before2hours); LocalDate d = today.plusYears(1).plusMonths(1).plusWeeks(1).plusDays(1);//1年1月1周又1天后 System.out.println(today+"\t"+d); }
4.2使用with调整日期时间
- withDayOfMonth()
- withMonth()
- withHours()
- with()
LocalDate firstday = LocalDate.now().withDayOfMonth(1);//本月第一天 System.out.println(firstday); LocalTime at = LocalTime.now().withSecond(0).withNano(0);//将秒和纳秒调整为0 System.out.println(at); LocalDate lastday = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());//本月最后1天 System.out.println(lastday); LocalDate firstSunday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));//本月第一个周日 System.out.println(firstday); }
4.3判断日期和时间先后
- isBefore()
- isAfter()
- equals()
public static void main(String[] args) { LocalDate d1 = LocalDate.of(2016,11,20); LocalDate d2 = LocalDate.of(2016,11,21); System.out.println(d1.isBefore(d2)); System.out.println(d1.isAfter(d2)); System.out.println(d1.equals(d2)); }
4.4Period计算2个时期相差多少
- getYears()
- getMonths()
- getDays()
public static void main(String[] args) { LocalDate d1 = LocalDate.of(2016,11,20); LocalDate d2 = LocalDate.of(2050,1,1); Period p = d1.until(d2); System.out.println(p);//P33Y1M12D ,即相差33年1月12天 System.out.println("年"+p.getYears()+"月"+p.getMonths()+"日"+p.getDays()); System.out.println((d2.toEpochDay()-d1.toEpochDay())+"天"); }
示例:
代码1:public static void main(String[] args) { LocalDate d1 = LocalDate.now(); System.out.println(d1); System.out.println("week="+d1.getDayOfWeek().getValue());//打印周几 LocalDate d2 = LocalDate.of(2016,11,30); LocalTime t2 = LocalTime.of(15,16,17); LocalDateTime dt2 = LocalDateTime.of(d2,t2); System.out.println(dt2); }
<img src="" />
5.总结:
LocalDate、LocalTime和LocalDateTime:
- 不变类(类似String)
- 默认按ISO 8601标准格式化和解析
- 使用DateTimeFormatter自定义格式化和解析
- 使用plusDays()/minusHours()等方法对日期和时间进行加减、返回新对象
- 使用withDayOfMonth()/with()等方法调整日期和时间,返回新对象
- 使用isBefore()/isAfter()/equals()判断日期和时间的先后
注意:LocalDateTime无法与long进行转换:
- 因为LocalDateTime没有时区,无法确定某一时刻
- ZonedDateTime有时区,可以与long进行转换