zoukankan      html  css  js  c++  java
  • Java8 日期和时间实用技巧

    新的日期API

    • ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则
    • Instant: 用来表示时间线上的一个点
    • LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的
    • LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的
    • LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的
    • Clock: 用于访问当前时刻、日期、时间,用到时区
    • Duration: 用秒和纳秒表示时间的数量

    最常用的就是LocalDate、LocalTime、LocalDateTime,从它们的名字就可以看出是操作日期和时间的。

    这些类是主要用于当时区不需要显式地指定的上下文。在本章节中我们将讨论最常用的api。

     

    LocalDate

    LocalDate代表一个IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
    获取当前的日期:

    LocalDate localDate = LocalDate.now();
    System.out.println("localDate: " + localDate);

    输出

    
    

    LocalDate可以指定特定的日期,调用of或parse方法返回该实例:

    LocalDate.of(2017, 07, 27);
    LocalDate.parse("2017-07-27");
    

    当然它还有一些其他方法,我们一起来看看:

    //为今天添加一天,也就是获取明天
    
    LocalDate tomorrow = LocalDate.now().plusDays(1);
    
    //从今天减去一个月
    
    LocalDate prevMonth = LocalDate.now().minus(1, ChronoUnit.MONTHS);

    输出

    下面写两个例子,分别解析日期 2017-07-27,获取每周中的星期和每月中的日:

    DayOfWeek thursday = LocalDate.parse("2017-07-27").getDayOfWeek();
    System.out.println("周四: " + thursday);
    int twenty = LocalDate.parse("2017-07-27").getDayOfMonth();
    System.out.println("twenty: " + twenty);
    

     输出

    试试今年是不是闰年:

    boolean leapYear = LocalDate.now().isLeapYear();
    System.out.println("是否闰年: " + leapYear);

     输出

    判断是否在日期之前或之后:

    boolean notBefore = LocalDate.parse("2017-07-27")
                    .isBefore(LocalDate.parse("2017-07-29"));
    System.out.println("notBefore: " + notBefore);
    boolean isAfter = LocalDate.parse("2017-07-27").isAfter(LocalDate.parse("2017-07-29"));
    System.out.println("isAfter: " + isAfter);

     输出

    获取这个月的第一天:

    LocalDate firstDayOfMonth = LocalDate.parse("2017-07-27")
                    .with(TemporalAdjusters.firstDayOfMonth());
    System.out.println("这个月的第一天: " + firstDayOfMonth);
    firstDayOfMonth = firstDayOfMonth.withDayOfMonth(1);
    System.out.println("这个月的第一天: " + firstDayOfMonth);

     输出

    判断今天是否是我的生日,例如我的生日是 2017-07-27

    LocalDate birthday = LocalDate.of(2017, 07, 27);
    MonthDay birthdayMd = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth());
    MonthDay today = MonthDay.from(LocalDate.now());
    System.out.println("今天是否是我的生日: " + today.equals(birthdayMd));

     输出

    LocalTime

    LocalTime表示一个时间,而不是日期,下面介绍一下它的使用方法。

    获取现在的时间

    LocalTime now = LocalTime.now();
    System.out.println("现在的时间: " + now);

    输出

    将一个字符串时间解析为LocalTime

    LocalTime nowTime = LocalTime.parse("14:18");
    System.out.println("时间是: " + nowTime);

    输出

    使用静态方法of创建一个时间

    LocalTime nowTime = LocalTime.of(14, 18);
    System.out.println("时间是: " + nowTime);

    使用解析字符串的方式并添加一小时

    LocalTime nextHour = LocalTime.parse("14:18").plus(1, ChronoUnit.HOURS);
    System.out.println("下一个小时: " + nextHour);

     输出

    获取时间的小时、分钟

    int hour = LocalTime.parse("14:18").getHour();
    System.out.println("小时: " + hour);
    int minute = LocalTime.parse("14:18").getMinute();
    System.out.println("分钟: " + minute);

     输出

    我们也可以通过之前类似的API检查一个时间是否在另一个时间之前、之后

    boolean isBefore = LocalTime.parse("14:18").isBefore(LocalTime.parse("15:18"));
    boolean isAfter = LocalTime.parse("14:18").isAfter(LocalTime.parse("15:18"));
    System.out.println("isBefore: " + isBefore);
    System.out.println("isAfter: " + isAfter);

    输出

    在LocalTime类中也将每天的开始和结束作为常量供我们使用:

    System.out.println(LocalTime.MAX);
    System.out.println(LocalTime.MIN);

    输出:

    
    

     

    LocalDateTime

    LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

    获取当前的日期和时间:

    LocalDateTime now = LocalDateTime.now();
    System.out.println("现在: " + now);

    输出

    
    

    下面使用静态方法和字符串的方式分别创建 LocalDateTime 对象

    LocalDateTime now = LocalDateTime.now();
    LocalDateTime.of(2017, Month.JULY, 20, 15, 18); LocalDateTime.parse("2017-07-20T15:18:00"); //同时`LocalDateTime`也提供了相关API来对日期和时间进行增减操作: LocalDateTime tomorrow = now.plusDays(1); System.out.println("明天的这个时间: " + tomorrow); LocalDateTime minusTowHour = now.minusHours(2); System.out.println("两小时前: " + minusTowHour);

    输出

    这个类也提供一系列的get方法来获取特定单位:

    LocalDateTime now = LocalDateTime.now();
    Month month = now.getMonth(); System.out.println("当前月份: " + month);

     输出

    日期格式化

    在日常开发中我们用到最多的也许就是日期、时间的格式化了,那在Java8种该如何操作

    LocalDateTime now = LocalDateTime.now();
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println("默认格式化: " + now);
    System.out.println("自定义格式化: " + now.format(dateTimeFormatter));
    LocalDateTime localDateTime = LocalDateTime.parse("2017-07-27 14:53:40", dateTimeFormatter);
    System.out.println("字符串转LocalDateTime: " + localDateTime);

     输出

    也可以使用DateTimeFormatterformat方法将日期、时间格式化为字符串

    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    String dateString = dateTimeFormatter.format(LocalDate.now());
    System.out.println("日期转字符串: " + dateString);

     输出

    日期周期

    Period类用于修改给定日期或获得的两个日期之间的区别。

    给初始化的日期添加5天:

    LocalDate initialDate = LocalDate.parse("2017-07-27");
    LocalDate finalDate   = initialDate.plus(Period.ofDays(5));
    System.out.println("初始化日期: " + initialDate);
    System.out.println("加日期之后: " + finalDate);

    //周期API中提供给我们可以比较两个日期的差别,像下面这样获取差距天数:
    long between = ChronoUnit.DAYS.between(initialDate, finalDate); System.out.println("差距天数: " + between);

    上面的代码会返回5,当然你想获取两个日期相差多少小时也是简单的。

    输出

     

    与遗留代码转换

    在之前的代码中你可能出现了大量的Date类,如何将它转换为Java8种的时间类

    DateInstant互相转换

    Date date = Date.from(Instant.now());
    Instant instant = date.toInstant();

    Date转换为LocalDateTime

    LocalDateTime localDateTime = LocalDateTime.from(new Date());
    System.out.println(localDateTime);

    LocalDateTimeDate

    Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());

    LocalDateDate

    Date date = Date.from(LocalDate.now().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
  • 相关阅读:
    Hard Rock
    Codeforces Round #416 (Div. 2) B. Vladik and Complicated Book
    codeforces 793B. Igor and his way to work
    codeforces 1B Spreadsheets
    HDU 1069 Monkey and Banana
    codeforces 2B The least round way
    【机器学习】 通俗说拟合
    python-八皇后问题
    python-核心知识思维导图
    python-@property 属性
  • 原文地址:https://www.cnblogs.com/hzzjj/p/7244705.html
Copyright © 2011-2022 走看看