java8 新增日期时间操作方式

2016-05-23 19:49:48   最后更新: 2016-07-05 23:04:02   访问数量:484




java 对日期时间的处理一直以来饱受诟病,也因此催生了 Joda-Time 项目来简化日期时间的处理,java8 汲取了 Joda-Time 的精髓,诞生了 java.time 包

 

Clock 类是 java.time 包中最基本的类,它可以获取用户定义时区的时间信息

// Get the system clock as UTC offset final Clock clock = Clock.systemUTC(); System.out.println(clock.instant()); System.out.println(clock.millis());

 

 

输出:

2014-04-12T15:19:29.282Z

1397315969360

 

但我通过反复尝试,无论通过 Clock.system 方法传入怎样的 ZoneId 参数,总是返回 UTC 时间,目前本博主暂未明白是怎么回事,只能日后进一步了解和更新博客了

 

基本用法

LocalDate 类用来表示当前日期,除日期外不包含其他数据

LocalDate today = LocalDate.now(); int year = today.getYear(); int month = today.getMonthValue(); int day = today.getDayOfMonth(); System.out.println("Today's Local date : " + today); System.out.printf("Year : %d; Month : %d; day : %d%n", year, month, day);

 

 

输出:

Today's Local date : 2016-05-23

Year : 2016; Month : 5; day : 23

 

偏移时间

LocalDate today = LocalDate.now(); System.out.println("Time after 1 week : " + today.plus(1, ChronoUnit.WEEKS)); System.out.println("Time before 1 year : " + today.minus(1, ChronoUnit.YEARS));

 

 

输出:

Time after 1 week : 2016-05-30

Time before 1 year : 2015-05-23

 

特定日期

通过上面的方法,你可以实现任意日期偏移前后的日期对象,你也可以通过年月日信息创建特定日期的 LocalDate:

LocalDate date1 = LocalDate.of(2014, 01, 14);

 

 

日期比较

java8 同时提供了日期的比较的方法:isBefore() 和 isAfter():

LocalDate tomorrow = LocalDate.of(2014, 1, 15); if (tommorow.isAfter(today)) { System.out.println("Tomorrow comes after today"); } LocalDate yesterday = today.minus(1, DAYS); if (yesterday.isBefore(today)){ System.out.println("Yesterday is day before today"); }

 

 

输出了:

Tomorrow comes after today

Yesterday is day before today

 

日期间隔的计算

日期的另一个重要使用场景是计算两个日期之间间隔的月、日数,java8 中也提供了简单实用的方法:

LocalDate java8Release = LocalDate.of(2014, Month.MARCH, 14); Period periodToJavaRelease = Period.between(java8Release, LocalDate.now()); System.out.println("After Java 8 release : " + periodToJavaRelease.getYears() + "years " + periodToJavaRelease.getMonths() + "months " + periodToJavaRelease.getDays() + "days" );

 

 

日期的另一个重要需求就是重复事件,如每年一度的生日、各种纪念日,每月的账单日等等

MonthDay 提供了解决这类问题的方案,它只包含月和日的信息,而不包含年份信息

 

下面的例子展示了判断是否是生日:

LocalDate dateOfBirth = LocalDate.of(2010, 01, 14); MonthDay birthday = MonthDay.of(dateOfBirth.getMonth(), dateOfBirth.getDayOfMonth()); MonthDay currentMonthDay = MonthDay.from(LocalDate.now()); if (currentMonthDay.equals(birthday)) { System.out.println("Many Many happy returns of the day !!"); } else { System.out.println("Sorry, today is not your birthday"); }

 

 

输出了:

After Java 8 release : 2years 2months 9days

 

有时,你所需要的仅仅是年和月的信息,比如判断某个月的天数:

YearMonth currentYearMonth = YearMonth.now(); YearMonth creditCardExpiry = YearMonth.of(2018, Month.FEBRUARY); System.out.printf("Your credit card expires on %s%n", creditCardExpiry); System.out.printf("Days in month year %s: %d%n", currentYearMonth, currentYearMonth.lengthOfMonth());

 

输出了:

Days in month year 2016-05: 31

Your credit card expires on 2018-02

 

与 LocalDate 十分类似,获取当前时间信息的是 LocalTime 类,他与 LocalDate 类刚好相反,他只包含时间信息,不包含任何日期相关的信息

LocalTime time = LocalTime.now(); System.out.println("Local time now : " + time); System.out.println("After 1 hour time : " + time.plusHours(1));

 

 

输出了:

Local time now : 16:28:42.718

After 1 hour time : 17:28:42.718

 

LocalDateTime 是 LocalDate 和 LocalTime 结合的日期时间,它的使用与前面介绍的是完全一样的:

LocalDateTime datetime = LocalDateTime.now(); System.out.println("Local time now : " + datetime); System.out.println("After 1 hour time : " + datetime.plusHours(1)); System.out.println("Before 2 years time : " + datetime.minusYears(2));

 

 

输出了:

Local time now : 2016-05-23T16:30:45.718

After 1 hour time : 2016-05-23T17:30:45.718

Before 2 years time : 2014-05-23T16:30:45.718

 

java8 中,Instant 类用来存储时间戳,可以方便的获取:

Instant timestamp = Instant.now(); System.out.println("Timestamp : " + timestamp.getEpochSecond()); System.out.println("Timestamp : " + System.currentTimeMillis());

 

 

输出了:

Timestamp : 1463993001

Timestamp : 1463993001018

 

可以使用 Instant 的 getEpochSecond 方法获取时间戳的秒数,而原来的 System.currentTimeMillis 方法获取的则是毫秒数时间戳

 

LocalDate 提供了 parse 方法用来解析日期格式

 

标准格式日期解析

String dayAfterTommorrow = "20140116"; LocalDate formatted = LocalDate.parse(dayAfterTommorrow, DateTimeFormatter.BASIC_ISO_DATE); System.out.printf("Date generated from String %s is %s %n", dayAfterTommorrow, formatted);

 

 

输出了:

Date generated from String 20140116 is 2014-01-16

 

自定义格式解析

我们也可以通过自定义 DateTimeFormatter 对象来实现自定义格式的解析:

String goodFriday = "Apr 18 2014"; try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy"); LocalDate holiday = LocalDate.parse(goodFriday, formatter); System.out.printf("Successfully parsed String %s, date is %s%n", goodFriday, holiday); } catch (DateTimeParseException ex) { System.out.printf("%s is not parsable!%n", goodFriday); ex.printStackTrace(); }

 

 

输出了:

Successfully parsed String Apr 18 2014, date is 2014-04-18

 

上面我们介绍了怎么讲字符串解析为日期格式,下面我们就来介绍一下怎么将 LocalDate 转换为指定格式的 String:

LocalDateTime arrivalDate = LocalDateTime.now(); try { DateTimeFormatter format = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm a"); String landing = arrivalDate.format(format); System.out.printf("Arriving at : %s %n", landing); } catch (DateTimeException ex) { System.out.printf("%s can't be formatted!%n", arrivalDate); ex.printStackTrace(); }

 

 

输出了:

Output : Arriving at : Jan 14 2014 04:33 PM

 






技术帖      时间      技术分享      localtime      java      新特性      java8      日期      localdate     


京ICP备15018585号