前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java8 Date API

Java8 Date API

作者头像
happyJared
发布2019-08-02 15:19:39
7870
发布2019-08-02 15:19:39
举报
文章被收录于专栏:happyJaredhappyJared

Java8 在 java.time 包下新增了全新的日期和时间 API。新的 Date API 与 Joda-Time 库有点相似,但又有不一样。

Clock

Clock 类提供了访问当前日期和时间的方法,Clock 是时区敏感的,可以用来取代 System.currentTimeMillis() 来获取当前的微秒数。某个特定的时间点可以使用 Instant 类来表示,Instant 类也可以用来创建旧版本的 java.util.Date 对象。

代码语言:javascript
复制
    Clock clock = Clock.systemDefaultZone();
    long millis = clock.millis();
    System.out.println(millis);  // 1552379579043
    Instant instant = clock.instant();
    System.out.println(instant);
    Date legacyDate = Date.from(instant);  // 2019-03-12T08:46:42.588Z
    System.out.println(legacyDate);  // Tue Mar 12 16:32:59 CST 2019

Timezones(时区)

在新 API 中,时区使用 ZoneId 来表示,可以很方便的使用静态方法 of 来获取到。 抽象类 ZoneId(在 java.time 包中)表示一个区域标识符。 它有一个名为 getAvailableZoneIds 的静态方法,它返回所有区域的标识符。

代码语言:javascript
复制
    // 输出所有区域标识符
    System.out.println(ZoneId.getAvailableZoneIds());
    ZoneId zone1 = ZoneId.of("Europe/Berlin");
    ZoneId zone2 = ZoneId.of("Brazil/East");
    System.out.println(zone1.getRules());  // ZoneRules[currentStandardOffset=+01:00]
    System.out.println(zone2.getRules());  // ZoneRules[currentStandardOffset=-03:00]

jdk1.8 中新增了 LocalDate 与 LocalDateTime 等类来解决日期处理方法,同时引入了一个新的类 DateTimeFormatter 来解决日期格式化问题。可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar,DateTimeFormatter 代替 SimpleDateFormat。

LocalTime(本地时间)

LocalTime 定义了一个没有时区信息的时间。下面的例子使用前面代码创建的时区创建了两个本地时间。之后比较时间并以小时和分钟为单位计算两个时间的时间差:

代码语言:javascript
复制
    LocalTime now1 = LocalTime.now(zone1);
    LocalTime now2 = LocalTime.now(zone2);
    System.out.println(now1.isBefore(now2));  // false

    long hoursBetween = ChronoUnit.HOURS.between(now1, now2);
    long minutesBetween = ChronoUnit.MINUTES.between(now1, now2);
    System.out.println(hoursBetween);       // -3
    System.out.println(minutesBetween);     // -239

LocalTime 提供了多种工厂方法来简化对象的创建,包括解析时间字符串:

代码语言:javascript
复制
    LocalTime late = LocalTime.of(23, 59, 59);
    System.out.println(late);       // 23:59:59
    DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.GERMAN);

    LocalTime leetTime = LocalTime.parse("13:37", germanFormatter);
    System.out.println(leetTime);   // 13:37

LocalDate(本地日期)

LocalDate 表示了一个确切的日期,比如 2014-03-11。该对象值是不可变的,用起来和 LocalTime 基本一致。下面的例子展示了如何给 Date 对象加减天/月/年。另外要注意的是这些对象是不可变的,操作返回的总是一个新实例。

代码语言:javascript
复制
    LocalDate today = LocalDate.now();  // 获取现在的日期
    System.out.println("今天的日期: "+today);  // 2019-03-12
    LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS);
    System.out.println("明天的日期: "+tomorrow);  // 2019-03-13
    LocalDate yesterday = tomorrow.minusDays(2);
    System.out.println("昨天的日期: "+yesterday);  // 2019-03-11
    LocalDate independenceDay = LocalDate.of(2019, Month.MARCH, 12);
    DayOfWeek dayOfWeek = independenceDay.getDayOfWeek();
    System.out.println("今天是周几:"+dayOfWeek);  // TUESDAY

从字符串解析一个 LocalDate 类型和解析 LocalTime 一样简单,下面是使用 DateTimeFormatter 解析字符串的例子:

代码语言:javascript
复制
    String str1 = "2014==04==12 01时06分09秒";
    // 根据需要解析的日期、时间字符串定义解析所用的格式器
    DateTimeFormatter fomatter1 = DateTimeFormatter.ofPattern("yyyy==MM==dd HH时mm分ss秒");

    LocalDateTime dt1 = LocalDateTime.parse(str1, fomatter1);
    System.out.println(dt1);  // 输出 2014-04-12T01:06:09

    String str2 = "2014$$$四月$$$13 20小时";
    DateTimeFormatter fomatter2 = DateTimeFormatter.ofPattern("yyy$$$MMM$$$dd HH小时");
    LocalDateTime dt2 = LocalDateTime.parse(str2, fomatter2);
    System.out.println(dt2);  // 输出 2014-04-13T20:00

再来看一个使用 DateTimeFormatter 格式化日期的示例:

代码语言:javascript
复制
LocalDateTime rightNow=LocalDateTime.now();
String date=DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(rightNow);
System.out.println(date);  // 2019-03-12T16:26:48.29
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
System.out.println(formatter.format(rightNow));  // 2019-03-12 16:26:48

LocalDateTime(本地日期时间)

LocalDateTime 同时表示了时间和日期,相当于前两节内容合并到一个对象上了。LocalDateTime 和 LocalTime 还有 LocalDate 一样,都是不可变的。LocalDateTime 提供了一些能访问具体字段的方法。

代码语言:javascript
复制
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59);

DayOfWeek dayOfWeek = sylvester.getDayOfWeek();
System.out.println(dayOfWeek);      // WEDNESDAY

Month month = sylvester.getMonth();
System.out.println(month);          // DECEMBER

long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY);
System.out.println(minuteOfDay);    // 1439

只要附加上时区信息,就可以将其转换为一个时间点 Instant 对象,Instant 时间点对象可以很容易的转换为老式的 java.util.Date

代码语言:javascript
复制
Instant instant = sylvester.atZone(ZoneId.systemDefault()).toInstant();
Date legacyDate = Date.from(instant);
System.out.println(legacyDate);     // Wed Dec 31 23:59:59 CET 2014

格式化 LocalDateTime 和格式化时间和日期一样的,除了使用预定义好的格式外,我们也可以自己定义格式:

代码语言:javascript
复制
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy - HH:mm");
LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter);
String string = formatter.format(parsed);
System.out.println(string);     // Nov 03, 2014 - 07:13

和 java.text.NumberFormat 不一样的是新版的 DateTimeFormatter 是不可变的,所以它是线程安全的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Clock
  • Timezones(时区)
  • LocalTime(本地时间)
  • LocalDate(本地日期)
  • LocalDateTime(本地日期时间)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档