欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Java8 新特性之日期API

程序员文章站 2022-07-19 19:42:40
java 8 在包java.time下包含了一组全新的时间日期api。下面的例子展示了这组新api里最重要的一些部分: 1.clock 时钟 clock类提供了访问当前...

java 8 在包java.time下包含了一组全新的时间日期api。下面的例子展示了这组新api里最重要的一些部分:

1.clock 时钟

clock类提供了访问当前日期和时间的方法,clock是时区敏感的,可以用来取代 system.currenttimemillis() 来获取当前的微秒数。某一个特定的时间点也可以使用instant类来表示,instant类也可以用来创建老的java.util.date对象。

clock clock = clock.systemdefaultzone();
long millis = clock.millis();
instant instant = clock.instant();
date legacydate = date.from(instant);  // legacy java.util.date

2.timezones 时区

在新api中时区使用zoneid来表示。时区可以很方便的使用静态方法of来获取到。 时区定义了到uts时间的时间差,在instant时间点对象到本地日期对象之间转换的时候是极其重要的。

system.out.println(zoneid.getavailablezoneids());
// prints all available timezone ids
zoneid zone1 = zoneid.of("europe/berlin");
zoneid zone2 = zoneid.of("brazil/east");
system.out.println(zone1.getrules());
system.out.println(zone2.getrules());
// zonerules[currentstandardoffset=+01:00]
// zonerules[currentstandardoffset=-03:00]

3.localtime 本地时间

localtime 定义了一个没有时区信息的时间,例如 晚上10点,或者 17:30:15。下面的例子使用前面代码创建的时区创建了两个本地时间。之后比较时间并以小时和分钟为单位计算两个时间的时间差:

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 提供了多种工厂方法来简化对象的创建,包括解析时间字符串。

localtime localtime= localtime.of(23, 59, 59);
system.out.println(localtime);    // 23:59:59
datetimeformatter germanformatter =
  datetimeformatter
    .oflocalizedtime(formatstyle.short)
    .withlocale(locale.german);
localtime leettime = localtime.format(germanformatter);
system.out.println(leettime);  

4.localdate 本地日期

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

localdate today = localdate.now();
localdate tomorrow = today.plus(1, chronounit.days);
localdate yesterday = tomorrow.minusdays(2);
localdate independenceday = localdate.of(2014, month.july, 4);
dayofweek dayofweek = independenceday.getdayofweek();
system.out.println(dayofweek);  // friday

从字符串解析一个localdate类型和解析localtime一样简单:

datetimeformatter germanformatter =
  datetimeformatter
    .oflocalizeddate(formatstyle.medium)
    .withlocale(locale.german);
localdate xmas = localdate.parse("24.12.2014", germanformatter);
system.out.println(xmas);  // 2014-12-24

5.localdatetime 本地日期时间

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

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。

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和格式化时间和日期一样的,除了使用预定义好的格式外,我们也可以自己定义格式:

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是不可变的,所以它是线程安全的。

以上所述是小编给大家介绍的java8 新特性之日期api,希望对大家有所帮助