java8新特性——时间日期API

  传统的时间 API 存在线程安全的问题,在多线程开发中必需要上锁,因此 java8 如今为咱们提供了一套全新的时间日期 API ,今天进来学习一下java8 的时间日期 API。java

 

1、使用 LocalDate、LocalTime、LocalDateTime安全

  LocalDate、LocalTime、LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 (ISO-8601 日历系统是国际化组织制定的现代化公民的日期和时间的表达法)日历系统的日期、时间、日期和时间。它们提供了简单的日期或时间,并不包含当前时间的时间信息。也不包含与时区相关的信息。多线程

  LocalDate LocalTime LocalDateTime 三个类的使用方式同样,只是表明的不一样而已。ide

  下面就以LocalDateTime做为例子进行示范:学习

    1.获取当前时间spa

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.对时间进行加减操做code

 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     }

  对旧的时间进行操做以后返回一个新的时间。orm

    

    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     }

 

2、使用 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     }

 

3、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     }

 

 

4、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     }

 

5、时间校订器

   TemporalAdjuster:时间矫正器。有时咱们可能须要获取一个周末,或者下一个工做日等时间,这里 java8 就为咱们提供了一个时间校订器,让咱们对时间进行校准。

  TemporalAdjusters:该类经过静态方法提供了大量的经常使用的TemporalAdjuster的实现供咱们使用。

  在localDateTime中,有一个with方法,其中可让咱们去写一TemporalAdjuster接口,而TemporalAdjusters类中,有许多经常使用的方法,下面就来看看:

 1     /**
 2  * 时间校订器TemporalAdjuster  3      */
 4  @Test  5     public void test10() {  6         LocalDateTime now1 = LocalDateTime.now();  7         //获取月中 第一天
 8  now1.with(TemporalAdjusters.firstDayOfMonth());  9         //获取下一年的第一天
10  now1.with(TemporalAdjusters.firstDayOfNextYear()); 11         //获取年中第一天
12  now1.with(TemporalAdjusters.lastDayOfYear()); 13         //获取月中最后一天
14  now1.with(TemporalAdjusters.lastDayOfMonth()); 15         //获取下个星期一
16  now1.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); 17         //自定时时间:下一个工做日,由于这里须要一个接口,因此彻底能够自定义方法
18         now1.with((e) -> { 19             LocalDateTime now = (LocalDateTime)e; 20             DayOfWeek dow = now.getDayOfWeek(); 21             if (dow.equals(DayOfWeek.FRIDAY)) 22                 return now.plusDays(3); 23             else if (dow.equals(DayOfWeek.SATURDAY)) 24                 return now.plusDays(2); 25             return  now.plusDays(1); 26  }); 27     }

 

 6、时间、日期格式化 DateTimeFormatter

   1. 时间转字符串

    在 DateTimeFormatter 中为咱们提供了一下多种格式转换方式,咱们能够去选择使用。

 1     /**
 2  * The printer and/or parser to use, not null.  3      */
 4     private final CompositePrinterParser printerParser;  5     /**
 6  * The locale to use for formatting, not null.  7      */
 8     private final Locale locale;  9     /**
10  * The symbols to use for formatting, not null. 11      */
12     private final DecimalStyle decimalStyle; 13     /**
14  * The resolver style to use, not null. 15      */
16     private final ResolverStyle resolverStyle; 17     /**
18  * The fields to use in resolving, null for all fields. 19      */
20     private final Set<TemporalField> resolverFields; 21     /**
22  * The chronology to use for formatting, null for no override. 23      */
24     private final Chronology chrono; 25     /**
26  * The zone to use for formatting, null for no override. 27      */
28     private final ZoneId zone;

 

     固然,咱们也能够自定义时间格式,进行转换。

1     /*
2  * 将时间转换为字符串 3      */
4  @Test 5     public void test11() { 6         LocalDate now = LocalDate.now(); 7         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss"); 8  now.format(dtf); 9     }

 

  2.将字符串转换为时间

1     /*
2  * 将字符串转换为时间 3      */
4  @Test 5     public void test12() { 6         DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY-MM-DD HH:mm:ss"); 7         LocalDateTime.parse("2018-06-18 21:45:23", dtf); 8     }
相关文章
相关标签/搜索