Java 8日期/时间( Date/Time)API是java8很重要的新增内容,也是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容。
为什么我们需要新的Java日期/时间API?
在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:
Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。
java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
对于时间、时间戳、格式化以及解析,并没有一些明确定义的类。对于格式化和解析的需求,我们有java.text.DateFormat抽象类,但通常情况下,SimpleDateFormat类被用于此类需求。
原有的时间类使用不方便,新时间类增加了很多语义化好的方法,比如plusMonths,plusWeeks。
所有的日期类都是可变的,因此他们都不是线程安全的,这是Java日期类最大的问题之一。
日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
java8 java.time关键类
| Instant——表示时间线上一个特定时刻 LocalDate——只包含日期时间类 LocalTime——它代表的是不含日期的时间,时分秒 LocalDateTime——包含了日期及时间,不存储时区信息 ZonedDateTime——包含时区的完整日期时间 |
Instant
由于java8中新增的time类都是不可变类,所以下面这些方法都会返回一个新的对象
|
Instantnow=Instant.now(); //获取当前时间
2017-04-15T02:22:38.842Z ISO-8601格式
now.plusSeconds(1);//增加秒,正负均可
now.plusMillis(100);
now.plus(1,ChronoUnit.DAYS);//增加一天
Instant.ofEpochMilli(System.currentTimeMillis()); //从时间戳获取实例
|
从时间格式字符串获取实例,ISO格式
| Instant.parse("2017-04-15T02:32:24.779Z") |
Instant时间大小先后比较
|
now.isAfter(otherInstant);
now.isBefore(otherInstant);
|
LocalDate
下面都是一些很直观可读性很强的方法,也没有老的时间库月份需要加1的坑
| LocalDate localDate = LocalDate.now(); //java8中获取当前日期 2017-04-15 System.out.println(localDate.getYear()); //年 2017 System.out.println(localDate.getMonth()); //月 APRIL System.out.println(localDate.getMonthValue()); //月数值 4 System.out.println(localDate.getDayOfMonth()); //天 15 |
java8中获取特定日期
java8中判断时间是否相等
Instant,LocalDate,LocalDateTime,ZonedDateTime都重写了equals方法,直接通过equals方法比较即可。
年月日增减
| localDate.plusYears(1); localDate.plusMonths(1); localDate.plusWeeks(1); localDate.plusDays(1); |
LocalDateTime
localDateTime于LocalDate类似,均含有get方法,of方法等。
|
System.out.println(localDateTime.getYear()); //年 2017
System.out.println(localDateTime.getMonth());//月
APRIL
System.out.println(localDateTime.getMonthValue());//月数值
4
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDateTime.getHour());
System.out.println(localDateTime.getMinute());
System.out.println(localDateTime.getSecond());
System.out.println(localDateTime.getNano());
|
java8中时间差比较
到下一个整点相差分钟数,11:20,还有40分钟12点
| LocalTime localTime1 = LocalTime.of(11,20); LocalTime localTime2 = LocalTime.of(12,0); System.out.print(localTime1.until(localTime2, ChronoUnit.MINUTES)); |
java8时间类相互转换
Instant 转Date
Date转Instant
LocalDateTime转Instant
|
localDateTime.atZone(ZoneId.systemDefault()).toInstant();
|
Instant转LocalDateTime
| ZoneId zone = ZoneId.systemDefault(); LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone); |
LocalDateTime获取LocalTime
|
LocalTimelocalTime=localDateTime.toLocalTime();
|
文章来源:http://www.itdouzi.com/java/java8-instant-localdatetime.html