Fellow Travellers

Java 8 之时间日期Api

万世威
字数统计: 790阅读时长: 3 min
2018/11/06 Share

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);// 2018-10-31

CharSequence text = "2010-10-10";
System.out.println(LocalDate.parse(text)); // 2010-10-10
CharSequence date = "20101010";
System.out.println(LocalDate.parse(date, DateTimeFormatter.BASIC_ISO_DATE));// 2010-10-10
// 自定义对应格式的转换,JDK1.8给出了预定义的格式化 DateTimeFormatter.BASIC_ISO_DATE 就是其中之一
CharSequence myDate = "2010年10月10日";
System.out.println(LocalDate.parse(myDate,DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); // 2010-10-10
LocalDate newDate = LocalDate.of(2019, 10, 10);
System.out.println(newDate);
// 月份亦可给出对应 Mouth 枚举
System.out.println(LocalDate.of(2010, Month.JULY, 10));// 2010-07-10
// 给出天数,计算出 从 1970-01-01 对应的日期
System.out.println(LocalDate.ofEpochDay(123)); // 1970-05-04
// 传入 年,日数,计算出 对应该年份 对应日子后的日期
System.out.println(LocalDate.ofYearDay(2010, 163)); //2010-06-12

//日期的加减
LocalDate localDate = LocalDate.of(2018, 7, 23);
System.out.println(localDate.plusMonths(1)); // 2018-08-23 加一个月
System.out.println(localDate.plusMonths(-1)); // 2018-06-23 减去一个月,传入负数即可,下面的也是
System.out.println(localDate.plusDays(1)); // 2018-07-24 加上一天
System.out.println(localDate.plusMonths(1)); // 2018-08-23 加上一个月

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
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); // 22:22:22
// 传入自定义文本,自定义格式化 构造 LocalTime 对象
CharSequence text2 = "11-11-11";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss");
LocalTime localTime2 = LocalTime.parse(text2, dateTimeFormatter);
System.out.println(localTime2); // 11:11:11

LocalTime time2 = LocalTime.of(13, 22);
// 判断时间1是否在时间2后
System.out.println(time1.isAfter(time2)); // true
// 判断时间1是否在时间2前
System.out.println(time1.isBefore(time2)); // false

// 两个时间之间的相差秒数,小时
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);

// localDateTime、LocalDate,LocalTime 转换
String date = "2018-11-23";
String time = "14:51:30";
LocalDate localDate = LocalDate.parse(date);
LocalTime localTime = LocalTime.parse(time);
// localDateTime --> LocalDate,LocalTime
LocalDate localDate1 = dateTime.toLocalDate();
LocalTime localTime1 = dateTime.toLocalTime();
System.out.println(localDate1);
System.out.println(localTime1);
// LocalDate、LocalTime --> LocalDateTime
LocalDateTime localDateTime2 = localDate.atTime(16, 02, 30);
System.out.println(localDateTime2);
LocalDateTime localDateTime3 = localTime.atDate(localDate);
System.out.println(localDateTime3);

DateTimeFormatter

类比 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
CATALOG
  1. 1. Java8-时间日期API
    1. 1.1. 对比
    2. 1.2. 新API介绍
    3. 1.3. LocalDate
    4. 1.4. LocalTime
    5. 1.5. LocalDateTime
    6. 1.6. DateTimeFormatter