详解Java8 新特性之日期API
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,希望对大家有所帮助