JDK 8中新日期时间API

Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。 新的 java.time中包含了所有关于本地日期(LocalDate)、本地时间 (LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime) 和持续时间(Duration)的类。历史悠久的 Date 类新增了 toInstant() 方法, 用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简 化了日期时间和本地化的管理。

新时间日期API:

  • java.time – 包含值对象的基础包

  • java.time.chrono – 提供对不同的日历系统的访问

  • java.time.format – 格式化和解析时间和日期

  • java.time.temporal – 包括底层框架和扩展特性

  • java.time.zone – 包含时区支持的类

一、LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime 类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。 它们提供了简单的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。 它们类似于Calendar类。

  • LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。

  • LocalTime表示一个时间,而不是日期。

  • LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

常用方法:

  • now() / * now(ZoneId zone) :静态方法,根据当前时间创建对象/指定时区的对象,获取当前的日期、时间、日期+时间。

LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
  • of():静态方法,根据指定日期/时间创建对象,设置指定的年、月、日、时、分、秒(没有偏移量)。

LocalDateTime localDateTime1 = LocalDateTime.of(2020, 10, 6, 13, 23, 43);
System.out.println(localDateTime1);
  • getXxx():获取对象的时间、日期属性。
    • getDayOfMonth()/getDayOfYear():获得月份天数(1-31) /获得年份天数(1-366)

    • getDayOfWeek():获得星期几(返回一个 DayOfWeek 枚举值)

    • getMonth():获得月份, 返回一个 Month 枚举值

    • getMonthValue() / getYear() :获得月份(1-12) /获得年份

    • getHour()/getMinute()/getSecond():获得当前对象对应的小时、分钟、秒

System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getDayOfWeek());
System.out.println(localDateTime.getMonth());
System.out.println(localDateTime.getMonthValue());
System.out.println(localDateTime.getMinute());
  • withXxx():设置相关的属性;将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象。
//体现不可变性
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println(localDate);
System.out.println(localDate1);

LocalDateTime localDateTime2 = localDateTime.withHour(4);
System.out.println(localDateTime);
System.out.println(localDateTime2);
  • minusXxx()/plusXxx():对当前对象进行加减操作。
    • plusDays(),plusWeeks(), plusMonths(), plusYears(),plusHours() :向当前对象添加几天、几周、几个月、几年、几小时。

    • minusMonths(),minusWeeks(),minusDays(),minusYears(),minusHours():从当前对象减去几月、几周、几天、几年、几小时。

LocalDateTime localDateTime4 = localDateTime.minusDays(6);
System.out.println(localDateTime);
System.out.println(localDateTime4);

二、Instant

时间线上的一个瞬时点,这可能被用来记录应用程序中的事件时间戳。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 日08时00分00秒)起至现在的总秒数。类似于 java.util.Date类。

常用方法:

  • now():静态方法,返回默认UTC时区的Instant类的对象。

Instant instant = Instant.now();
System.out.println(instant);
  • ofEpochMilli(long epochMilli):静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象。
//类似于Date(long millis)
Instant instant1 = Instant.ofEpochMilli(1550475314878L);
System.out.println(instant1);
  • atOffset(ZoneOffset offset):结合即时的偏移(时区,中国为东八区,offset参数即为8)来创建一个 OffsetDateTime类对象。
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2019-02-18T15:32:50.611+08:00
  • toEpochMilli():返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳。
// 类似于Date类的getTime()
long milli = instant.toEpochMilli();
System.out.println(milli);

三、DateTimeFormatter

格式化或解析日期、时间,类似于SimpleDateFormat类。

常用方法:

  • ofPattern(String pattern):静态方法 , 返回一个指定字符串格式的DateTimeFormatter。

  • format(TemporalAccessor t) 格式化一个日期、时间,返回字符串。

  • parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间。

该类提供了三种格式化方法:

 

 

 

 

3.1 预定义的标准格式

如:ISO_LOCAL_DATE_TIME、ISO_LOCAL_DATE、ISO_LOCAL_TIME

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2019-02-18T15:42:18.797

 //解析:字符串 -->日期
TemporalAccessor parse = formatter.parse("2019-02-18T15:42:18.797");
System.out.println(parse);

3.2 本地化相关的格式

  • ofLocalizedDateTime():如FormatStyle.LONG、FormatStyle.MEDIUM、FormatStyle.SHORT,适用于LocalDateTime。

DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
System.out.println(str2);
  • ofLocalizedDate():如FormatStyle.FULL、FormatStyle.LONG、FormatStyle.MEDIUM、FormatStyle.SHORT,适用于LocalDate。
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM);
//格式化
String str3 = formatter2.format(LocalDate.now());
System.out.println(str3);

3.3 自定义的格式(常用)

  • ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
System.out.println(str4);//2019-02-18 03:52:09
//解析
TemporalAccessor accessor = formatter3.parse("2019-02-18 03:52:09");
System.out.println(accessor);

四、其它类

4.1 介绍

  • ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris

  • ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00 Europe/Paris。

  • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等

  • Clock:使用时区提供对当前即时、日期和时间的访问的时钟。

    • 持续时间:Duration,用于计算两个“时间”间隔

    • 日期间隔:Period,用于计算两个“日期”间隔

  • TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整 到“下一个工作日”等操作。

  • TemporalAdjusters : 该类通过静态方法 (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster 的实现。

4.2 使用例

//Duration:用于计算两个“时间”间隔,以秒和纳秒为基准
LocalTime localTime = LocalTime.now();
LocalTime localTime1 = LocalTime.of(15, 23, 32);
//between():静态方法,返回Duration对象,表示两个时间的间隔
Duration duration = Duration.between(localTime1, localTime);
System.out.println(duration);
System.out.println(duration.getSeconds());
System.out.println(duration.getNano());
LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
Duration duration1 = Duration.between(localDateTime1, localDateTime);
System.out.println(duration1.toDays());
//Period:用于计算两个“日期”间隔,以年、月、日衡量
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.of(2028, 3, 18);
Period period = Period.between(localDate, localDate1);
System.out.println(period);
System.out.println(period.getYears());
System.out.println(period.getMonths());
System.out.println(period.getDays());
Period period1 = period.withYears(2);
System.out.println(period1);
// TemporalAdjuster:时间校正器
// 获取当前日期的下一个周日是哪天?
TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
System.out.println(localDateTime);
// 获取下一个工作日是哪天?
LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
    @Override
    public Temporal adjustInto(Temporal temporal) {
        LocalDate date = (LocalDate) temporal;
        if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
            return date.plusDays(3);
        } else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) {
            return date.plusDays(2);
        } else {
            return date.plusDays(1);
        }
    }
});
System.out.println("下一个工作日是:" + localDate);

4.3 与传统日期处理的转换

To 遗留类 From 遗留类
java.time.Instant与java.util.Date Date.from(instant) date.toInstant()
java.time.Instant与java.sql.Timestamp Timestamp.from(instant) timestamp.toInstant()
java.time.ZonedDateTime与 java.util.GregorianCalendar GregorianCalendar.from(zonedDateTime) cal.toZonedDateTime()
java.time.LocalDate与java.sql.Time Date.valueOf(localDate) date.toLocalDate()
java.time.LocalTime与java.sql.Time Date.valueOf(localDate) date.toLocalTime()
java.time.LocalDateTime与 java.sql.Timestamp Timestamp.valueOf(localDateTime) timestamp.toLocalDateTime()
java.time.ZoneId与java.util.TimeZone Timezone.getTimeZone(id) timeZone.toZoneId()
java.time.format.DateTimeFormatter与 java.text.DateFormat formatter.toFormat()

 

版权声明:
作者:jackqiang
链接:http://www.jackqiang.com/javase/classes/1904/dateafterjdk8/
来源:JackQiang's
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录