JAVA8 新的时间库

JAVA8 新的时间库

java8引入了一套全新的时间日期API,本篇随笔将说明学习java8的这套API。

java。time包中的是类是不可变且线程安全的。新的时间及日期API位于java.time中,下面是一些关键类

●Instant——它代表的是时间戳

●LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。

●LocalTime——它代表的是不含日期的时间

●LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。

●ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

LocalDate

用户获取或者设置时间的一个常用类

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
		 */

1. java中创建日期

LocalDate localDate=LocalDate.of(2019, 04, 11);
   	System.out.println(localDate);
   	
   	/**
   	 * 輸出 2019-04-11
   	 */

2.检查日期是否相等

LocalDate localDate=LocalDate.of(2019, 04, 11);
   	LocalDate nowDate=LocalDate.now();
   	System.out.println(localDate.equals(nowDate));
/**
   	 * false
   	 */

3.在java中如何判断某个日期在另一个日期的前面还是后面

用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

 
		 */
		

4.如何获取一周后的时间

其中可以利用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
 
		 */

5.如何获取一周前的时间

上面利用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

 
		 */

LocalTime

1.java中获取当前时间

默认的格式是hh:mm:ss:nnn


LocalTime nowTime=LocalTime.now();
		System.out.println(nowTime);
		
		/**
		 * 16:30:18.460
		 */

2.如何增加时间里面的小时数

 	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 
   	 */

6.两个日期之间包含多少天,多少月

计算两个日期之间包含多少天、周、月、年。可以用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

		 */

时区

1.在java8中处理不同的时区

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]
		 */

如何在java8中使用预定义的格式器来对日期进行解析/格式化

	LocalDate nowTime=LocalDate.parse("20180223", DateTimeFormatter.BASIC_ISO_DATE);
		System.out.println(nowTime);
		
		/**
		 * 2018-02-23

		 */

java8中日期与时间API的几个关键点

经过上面的例子,我们已经对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"。

你可能感兴趣的:(JAVA8 新的时间库)