传统的时间 API 存在线程安全的问题,在多线程开发中必须要上锁,所以 java8 现在为我们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API。
一、使用 LocalDate、LocalTime、LocalDateTime
LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 (ISO-8601 日历系统是国际化组织制定的现代化公民的日期和时间的表达法)日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前时间的时间信息。也不包含与时区相关的信息。
LocalDate LocalTime LocalDateTime 三个类的使用方式一样,只是代表的不同而已。
下面就以LocalDateTime作为例子进行示范:
1.获取当前时间
1 /** 2 * 获取当前时间 3 */ 4 @Test 5 public void test1() { 6 LocalDateTime now = LocalDateTime.now(); 7 }
2.获取指定时间日期
1 /** 2 * 获取指定时间日期 3 */ 4 @Test 5 public void test2() { 6 LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10); 7 }
3.对时间进行加减操作
1 /** 2 * 对时间进行加减操作 3 */ 4 @Test 5 public void test3() { 6 LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10); 7 //加时间 8 LocalDateTime time1 = now.plusYears(1).plusMonths(2). 9 plusDays(3).plusHours(5).plusMinutes(45). 10 plusSeconds(32); 11 //剪时间 12 LocalDateTime time2 = now.minusYears(1).minusMonths(2). 13 minusDays(3).minusHours(5).minusMinutes(45). 14 minusSeconds(32); 15 }
对旧的时间进行操作之后返回一个新的时间。
4. 获取获取时间的年、月、日
1 /** 2 * 获取时间的年、月、日 3 */ 4 @Test 5 public void test4() { 6 LocalDateTime now = LocalDateTime.of(2018, 6, 10, 10, 10, 10); 7 //获取年 8 int year = now.getYear(); 9 //获取月 10 Month month = now.getMonth(); 11 //获取月的value值 12 int monthValue = now.getMonthValue(); 13 //获取在本月的第几天(日) 14 int dayOfMonth = now.getDayOfMonth(); 15 //获取在本年的第几天 16 int dayOfYear = now.getDayOfYear(); 17 //获取在本周的第几天(星期几) 18 DayOfWeek dayOfWeek = now.getDayOfWeek(); 19 //获取小时 20 int hour = now.getHour(); 21 //获取分钟 22 int minute = now.getMinute(); 23 //获取秒 24 int second = now.getSecond(); 25 //获取纳秒 26 int nano = now.getNano();27 }
二、使用 Instant : 时间戳(以Unix 元年 : 1970-01-01 00:00:00 到某个时间之间的毫秒数)
1. 获取系统当前时间
1 /** 2 * 获取当前时间 默认获取 UTC 时区 3 */ 4 @Test 5 public void test5() { 6 Instant now = Instant.now(); 7 }
上面时间默认获取到的是 UTC 时区的时间,与中国时间相差8小时,我们可以给它设置偏移量。
1 /** 2 * 获取中国当前时间 3 */ 4 @Test 5 public void test6() { 6 Instant now = Instant.now(). 7 atOffset(ZoneOffset.ofHours(8)).toInstant(); 8 }
2. 获取当前时间的时间戳
1 /** 2 * 获取中国当前时间戳 3 */ 4 @Test 5 public void test7() { 6 long now = Instant.now(). 7 atOffset(ZoneOffset.ofHours(8)).toInstant().toEpochMilli(); 8 }
三、Duration 计算两个时间之间的间隔
1 /** 2 * 获取两个时间之间的间隔 3 */ 4 @Test 5 public void test8() { 6 Instant now1 = Instant.now(); 7 Instant now2 = Instant.now(). 8 atOffset(ZoneOffset.ofHours(8)).toInstant(); 9 Duration.between(now1, now2); 10 11 LocalDateTime now3 = LocalDateTime.now(); 12 LocalDateTime now4 = LocalDateTime.of(2018, 6, 10, 10, 10, 10); 13 14 Duration.between(now3, now4); 15 }
四、Period 计算两个日期之间的间隔
1 /** 2 * 获取两个日期之间的间隔 3 */ 4 @Test 5 public void test9() { 6 LocalDate now1 = LocalDate.now(); 7 LocalDate now2 = LocalDate.of(2018, 6, 10); 8 9 Period.between(now1, now2); 10 }