写在前面
Java8刚发布没多久,只是带着“追新”的心里。去试了试最新版的时间库.(java.time).在java.time发布之后,估计java.util.Date,java.text.SimpleDateFormat还是会用上一段时间的.不过新时间库看起来真的是下了一番功夫.
大概如下:
- LocalDate:位于java.time,主要代表的是:yyyy-MM-dd的日期类型.
- LocalDateTime:位于java.time,主要代表的是:yyyy-MM-dd HH:mm:ss.SSS的日期类型.
- LocalTime:同上,只是代表的是HH:mm:ss.SSS的日期类型.
- 新api大多数类都有plus(加),minus(减),of,parse,get等这些方法,用起来很方便.
介绍
如果你要找api文档,可以访问:【Java8英文在线api】
先看一下在java8以前是怎么格式化时间的:
1 2 3 | //import java.util.Date; //import java.text.SimpleDateFormat; new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ").format(new Date(System.currentTimeMillis())); |
[在继续阅读之前,请确认你已经安装了Java8.]
获取当前时间
然后我们看下如何在[Java8]中运行呢:
1 2 3 4 5 | //import java.time.LocalDateTime; LocalDateTime.now(); //在LocalDateTime类中,有分别获取年、月、日、时、分、秒的方法.类似java.util.Calendar的用法. //格式化也就更自由一些,具体可以参考LocalDateTime类. //输出:2014-07-29T11:10:15.225 |
一行就搞定了(oracle在后台帮我们做了很多事情),只是在格式上有出入而已.[我始终有点不明白为啥中间要多个(T)].
获取年月日
1 2 3 | //import java.time.LocalDate LocalDate.now(); //在LocalDate类中,有分别获取年、月、日的方法.类似java.util.Calendar的用法. |
获取时分秒
1 2 3 | //import java.time.LocalTime; LocalTime.now(); //在LocalTime类中,有分别获取时、分、秒的方法.类似java.util.Calendar的用法. |
将字符串转换成LocalDateTime类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; //转换日期 String input = "2014-05-01 11:10:20"; try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm:ss"); LocalDate date = LocalDate.parse(input, formatter); System.out.printf("%s%n\n", date); } catch (DateTimeParseException exc) { System.out.printf("%s is not parseable!%n", input); throw exc; } |
时间偏移:计算你的生日还有多久
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | //import java.time.LocalDate; //import java.time.Month; //import java.time.Period; //import java.time.temporal.ChronoUnit; LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1910, Month.JANUARY, 1); LocalDate nextbday = birthday.withYear(today.getYear()); if (nextbday.isBefore(today) || nextbday.isEqual(today)) { nextbday = nextbday.plusYears(1); } //计算还有多少天是下一次生日. Period p = Period.between(today, nextbday);//计算时间偏移,返回Period long p2 = ChronoUnit.DAYS.between(today, nextbday);//计算相差多少天 System.out.println("There are " + p.getMonths() + " months, and " + p.getDays() + " days until your next birthday.( " + p2 + " total )"); System.out.println("------------------------------------------"); //计算多少岁. Period ps2 = Period.between(birthday, today); long ps3 = ChronoUnit.DAYS.between(birthday, today); System.out.println("you are " + ps2.getYears() + " years," + ps2.getMonths() + " months, and " + ps2.getDays() + " days old.( " + ps3 + " total )"); //Period用于计算两个时间之间,相距几年几月几天。 //ChronoUnit是一个枚举,定义了各种标准时间单位. //另外在DayOfWeek、Month中定义了很多现成的枚举,方便直接调用. |
java.time一部分类的简介
红色圈中的说明该类可能经常用到.
PS上图中最后三行英文的翻译:
- *:秒捕获纳秒精度.
- **:这个类不存储这些信息,但在这些单元方法提供时间.
- ***:当一个Period添加到一个ZoneDateTime,会发生差异.
升级到java8
假如,我要从之前的版本升级到java8,对于日期操作,新版与旧版的对比如下:
后面的
在这上面写的很不足,因为每个人的需求不一样.
所以有更多需求还是去看java8的api文档吧.
另外推荐两篇文章:Java8的Lamb表达式