Java8-时间日期API
对比
- 线程不安全:java.util.Date 这个类线程不安全,而且所有日期类都是可变的。
- 时间处理麻烦:默认的开始日期从1900年,不支持国际化,不提供时区支持 。
- 容易导错包。(java.util 和 java.sql)
- 月份从0开始。
新API介绍
- Instant——它代表的是时间戳
- LocalDate——不包含具体时间的日期,比如2014-01-14
- LocalTime——它代表的是不含日期的时间
- LocalDateTime——它包含了日期及时间
- ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的
- Duration——主要用于以秒和纳秒衡量时长
LocalDate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| LocalDate now = LocalDate.now(); System.out.println(now);
CharSequence text = "2010-10-10"; System.out.println(LocalDate.parse(text)); CharSequence date = "20101010"; System.out.println(LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE));
CharSequence myDate = "2010年10月10日"; System.out.println(LocalDate.parse(myDate,DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); LocalDate newDate = LocalDate.of(2019, 10, 10); System.out.println(newDate);
System.out.println(LocalDate.of(2010, Month.JULY, 10));
System.out.println(LocalDate.ofEpochDay(123));
System.out.println(LocalDate.ofYearDay(2010, 163));
LocalDate localDate = LocalDate.of(2018, 7, 23); System.out.println(localDate.plusMonths(1)); System.out.println(localDate.plusMonths(-1)); System.out.println(localDate.plusDays(1)); System.out.println(localDate.plusMonths(1));
|
LocalTime
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| LocalTime time1 = LocalTime.now(); System.out.println(time1);
LocalTime time = LocalTime.of(22, 18, 33); System.out.println(time); CharSequence text1 = "22:22:22"; LocalTime localTime1 = LocalTime.parse(text1); System.out.println(localTime1);
CharSequence text2 = "11-11-11"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss"); LocalTime localTime2 = LocalTime.parse(text2, dateTimeFormatter); System.out.println(localTime2);
LocalTime time2 = LocalTime.of(13, 22);
System.out.println(time1.isAfter(time2));
System.out.println(time1.isBefore(time2));
Duration duration = Duration.between(time1, time2); long days = duration.toDays(); long hours = duration.toHours(); long millis = duration.toMillis()/1000; System.out.println(days + "-" + hours + "-" + millis);
|
LocalDateTime
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| LocalDateTime dateTime = LocalDateTime.now(); System.out.println(dateTime);
String date = "2018-11-23"; String time = "14:51:30"; LocalDate localDate = LocalDate.parse(date); LocalTime localTime = LocalTime.parse(time);
LocalDate localDate1 = dateTime.toLocalDate(); LocalTime localTime1 = dateTime.toLocalTime(); System.out.println(localDate1); System.out.println(localTime1);
LocalDateTime localDateTime2 = localDate.atTime(16, 02, 30); System.out.println(localDateTime2); LocalDateTime localDateTime3 = localTime.atDate(localDate); System.out.println(localDateTime3);
|
类比 SimpleDateFormat,会存在线程安全问题,java8 中使用此类代替。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM-dd"); String format = formatter.format(LocalDate.now()); System.out.println(format);//2018/10-31
DateTimeFormatter date = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG); System.out.println(date.format(LocalDate.now()));//2018年10月31日
DateTimeFormatter date1 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL); System.out.println(date1.format(LocalDate.now()));//2018年10月31日 星期三
DateTimeFormatter date3 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM); System.out.println(date3.format(LocalDate.now()));//2018-10-31
DateTimeFormatter date2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT); System.out.println(date2.format(LocalDate.now()));//18-10-31
|