• java8新特性——时间日期API


      传统的时间 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     }

    五、时间校正器

       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     }

     六、时间、日期格式化 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     }
  • 相关阅读:
    C语言编程练习41:ACboy needs your help again!
    C语言编程练习40:Ignatius and the Princess II
    C语言编程练习39:Solving Oder
    C语言编程练习38:火车出站
    C语言编程练习37:出栈合法性
    C语言编程练习36:赌徒
    C语言编程练习35:叠筐
    C语言编程练习34:Tr A
    网购手机被坑了?
    meta标签
  • 原文地址:https://www.cnblogs.com/wuyx/p/9164502.html
Copyright © 2020-2023  润新知