java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。
java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类
●Instant——它代表的是时间戳
●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
●LocalTime——它代表的是不含日期的时间
●LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
用户获取或者设置时间的一个常用类
LocalDate localDate=LocalDate.now();
System.out.println(localDate.getYear());
System.out.println(localDate.getMonthValue());
System.out.println(localDate.getDayOfMonth());
System.out.println(localDate.getDayOfWeek());
System.out.println(localDate);
/**输出
* 2019
3
7
THURSDAY
2019-03-07
*/
LocalDate localDate=LocalDate.of(2019, 04, 11);
System.out.println(localDate);
/**
* 輸出 2019-04-11
*/
LocalDate localDate=LocalDate.of(2019, 04, 11);
LocalDate nowDate=LocalDate.now();
System.out.println(localDate.equals(nowDate));
/**
* false
*/
用isBefore函数或者isAfter函数来判断之前或者之后
LocalDate nowTime=LocalDate.now();
System.out.println("现在的时间是:"+nowTime);
LocalDate oneDate=LocalDate.of(2019, 02, 25);
System.out.println(oneDate+"比当前时间早吗?"+oneDate.isBefore(nowTime));
/**
现在的时间是:2019-03-07
2019-02-25比当前时间早吗?true
*/
其中可以利用plus方法,并且结合ChronoUnit里面的类型进行设置你需要添加的时间
LocalDate nowTime=LocalDate.now();
System.out.println("现在的时间是:"+nowTime);
LocalDate addWeekTime=nowTime.plus(1, ChronoUnit.WEEKS);
System.out.println("添加1周后的时间:"+addWeekTime);
LocalDate addMonthTime=nowTime.plus(1, ChronoUnit.MONTHS);
System.out.println("添加1个月后的时间:"+addMonthTime);
/**
现在的时间是:2019-03-07
添加1周后的时间:2019-03-14
添加1个月后的时间:2019-04-07
*/
上面利用plus获取了数学上的加运算,同理要获取减运算,也就是获取某个时间段之前的时间可以利用minus方法来获取
LocalDate nowTime=LocalDate.now();
System.out.println("现在的时间是:"+nowTime);
LocalDate addWeekTime=nowTime.minus(1, ChronoUnit.WEEKS);
System.out.println("获取1周前的时间:"+addWeekTime);
LocalDate addMonthTime=nowTime.minus(1, ChronoUnit.MONTHS);
System.out.println("获取1个月前的时间:"+addMonthTime);
/**
现在的时间是:2019-03-07
获取1周前的时间:2019-02-28
获取1个月前的时间:2019-02-07
*/
默认的格式是hh:mm:ss:nnn
LocalTime nowTime=LocalTime.now();
System.out.println(nowTime);
/**
* 16:30:18.460
*/
LocalTime nowTime=LocalTime.now();
System.out.println("现在的时间是:"+nowTime);
LocalTime addHouseTime=nowTime.plusHours(2);
System.out.println("添加小时数后的时间:"+addHouseTime);
/**
现在的时间是:16:33:44.339
添加小时数后的时间:18:33:44.339
*/
计算两个日期之间包含多少天、周、月、年。可以用java.time.Period类完成该功能。下面例子中将计算日期与将来的日期之间一共有几个月
LocalDate nowTime=LocalDate.now();
LocalDate oneTime=LocalDate.of(2018, 02, 12);
Period period=Period.between(nowTime, oneTime);
System.out.println("相差天數:"+period.getDays());
System.out.println("相差月數:"+period.getMonths());
System.out.println("相差年数:"+period.getYears());
/**
* 相差天數:-23
相差月數:0
相差年数:-1
*/
java8中不仅将日期和时间进行了分离,同时还有时区。比如ZonId代表的是某个特定时区,ZonedDateTime代表带时区的时间,等同于以前的GregorianCalendar类。使用该类,可以将本地时间转换成另一个时区中的对应时间。
LocalDateTime nowTime=LocalDateTime.now();
ZoneId zoneId=ZoneId.of(ZoneId.SHORT_IDS.get("CST"));
ZonedDateTime zoneDateTime=ZonedDateTime.of(nowTime, zoneId);
System.out.println(zoneDateTime);
/**
* 2019-03-07T16:54:14.982-06:00[America/Chicago]
*/
LocalDate nowTime=LocalDate.parse("20180223", DateTimeFormatter.BASIC_ISO_DATE);
System.out.println(nowTime);
/**
* 2018-02-23
*/
经过上面的例子,我们已经对java8的时间日期有了一定的了解,现在回顾一下
●它提供了javax.time.ZoneId用来处理时区。
●它提供了LocalDate与LocalTime类
●Java 8中新的时间与日期API中的所有类都是不可变且线程安全的,这与之前的Date与Calendar API中的恰好相反,那里面像java.util.Date以及SimpleDateFormat这些关键的类都不是线程安全的。
●新的时间与日期API中很重要的一点是它定义清楚了基本的时间与日期的概念,比方说,瞬时时间,持续时间,日期,时间,时区以及时间段。它们都是基于ISO日历体系的。
每个Java开发人员都应该至少了解这套新的API中的这五个类:
●Instant 它代表的是时间戳,比如2016-04-14T14:20:13.592Z,这可以从java.time.Clock类中获取,像这样: Instant current = Clock.system(ZoneId.of(“Asia/Tokyo”)).instant();
●LocalDate 它表示的是不带时间的日期,比如2016-04-14。它可以用来存储生日,周年纪念日,入职日期等。
●LocalTime - 它表示的是不带日期的时间
●LocalDateTime - 它包含了时间与日期,不过没有带时区的偏移量
●ZonedDateTime - 这是一个带时区的完整时间,它根据UTC/格林威治时间来进行时区调整
●这个库的主包是java.time,里面包含了代表日期,时间,瞬时以及持续时间的类。它有两个子package,一个是java.time.foramt,这个是什么用途就很明显了,还有一个是java.time.temporal,它能从更低层面对各个字段进行访问。
●时区指的是地球上共享同一标准时间的地区。每个时区都有一个唯一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。比如说,东京的偏移时间就是+09:00。
●OffsetDateTime类实际上包含了LocalDateTime与ZoneOffset。它用来表示一个包含格林威治时间偏移量(+/-小时:分,比如+06:00或者 -08:00)的完整的日期(年月日)及时间(时分秒,纳秒)。
●DateTimeFormatter类用于在Java中进行日期的格式化与解析。与SimpleDateFormat不同,它是不可变且线程安全的,如果需要的话,可以赋值给一个静态变量。DateTimeFormatter类提供了许多预定义的格式器,你也可以自定义自己想要的格式。当然了,根据约定,它还有一个parse()方法是用于将字符串转换成日期的,如果转换期间出现任何错误,它会抛出DateTimeParseException异常。类似的,DateFormatter类也有一个用于格式化日期的format()方法,它出错的话则会抛出DateTimeException异常。
●再说一句,“MMM d yyyy”与“MMm dd yyyy”这两个日期格式也略有不同,前者能识别出"Jan 2 2014"与"Jan 14 2014"这两个串,而后者如果传进来的是"Jan 2 2014"则会报错,因为它期望月份处传进来的是两个字符。为了解决这个问题,在天为个位数的情况下,你得在前面补0,比如"Jan 2 2014"应该改为"Jan 02 2014"。