廖雪峰Java7处理日期和时间-3java.time的API-1LocalDateTime

1.java.time提供了新的日期和时间API:

  • LocalDate/LocalTime/LocalDateTime
  • ZoneDateTime/ZoneId
  • Instant
  • Formatter

新API特点:

  • 严格区分日期、时间
  • 所有的类均为不变类(类似String)
  • 修复了Month范围1-12(Jan~Dec)
  • Week范围1-7(Mon~Sun)

2.LocalDate/LocalTime/LocalDateTime

  • LocalDate:本地日期
  • LocalTime:本地时间
  • LocalDateTime:本地日期+时间
    public static void main(String[] args) {
        //获取当前日期时间
        LocalDate d = LocalDate.now();//获取当前日期
        LocalTime t = LocalTime.now();//当去当前时间
        LocalDateTime dt = LocalDateTime.now();//获取当前日期和时间
        //Local严格按照ISO 8601格式打印
        System.out.println(d+"\t"+t+"\t"+dt);

        //指定日期时间
        LocalDate d2 = LocalDate.of(2016,11,30);//构造LocalDate对象,月份不再减1,即11是11月,不是12月
        LocalTime t2 = LocalTime.of(15,16,17);//构造LocalTime对象
        LocalDateTime dt2 = LocalDateTime.of(2016,11,30,15,16,17);//构造LocalDateTime对象
        LocalDateTime dt3 = LocalDateTime.of(d2,t2);//根据LocalDate和LocalTime对象构造LocalDateTime对象
        System.out.println(d2+"\t"+t2+"\t\t"+dt2);
    }

2.1DateTimeFormatter是不可变类

    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println(dtf.format(LocalDateTime.now()));
        System.out.println(LocalDateTime.now().format(dtf));

        LocalDateTime dt2 = LocalDateTime.parse("2019-04-11 19:27:18",dtf);
        System.out.println(dt2);
    }

3.parse将字符串解析为日期时间

默认是按照ISO标准格式进行解析的。如果传入的标准格式的日期、时间,可以自动解析。

  • yyyy-MM-dd
  • HH:mm:ss
  • HH:mm:ss:SSS
  • yyyy-MM-dd'T'HH:mm:ss
  • yyyy-MM-dd'T'HH:mm:ss.SSS
    public static void main(String[] args) {
        LocalDate d1 = LocalDate.parse("2001-05-06");
        System.out.println(d1);
        LocalTime t1 = LocalTime.parse("15:16:17");
        System.out.println(t1);
        LocalTime t2 = LocalTime.parse("15:16:17.99");
        System.out.println(t2);
        LocalDateTime dt1 = LocalDateTime.parse("2016-11-30T15:16:17");
        System.out.println(dt1);
        LocalDateTime dt2 = LocalDateTime.parse("2016-11-30T15:16:17.333");
        System.out.println(dt2);
    }

4.日期和时间运算

4.1对日期和时间进行加减

  • plusDays()
  • minusHours()
  • plusWeeks()
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalDate after5days = today.plusDays(5);//加5天
        System.out.println(today+"\t"+after5days);

        LocalTime now = LocalTime.now();
        LocalTime before2hours = now.minusHours(2);//减2小时
        System.out.println(now+"\t"+before2hours);

        LocalDate d = today.plusYears(1).plusMonths(1).plusWeeks(1).plusDays(1);//1年1月1周又1天后
        System.out.println(today+"\t"+d);
    }

4.2使用with调整日期时间

  • withDayOfMonth()
  • withMonth()
  • withHours()
  • with()
        LocalDate firstday = LocalDate.now().withDayOfMonth(1);//本月第一天
        System.out.println(firstday);
        LocalTime at = LocalTime.now().withSecond(0).withNano(0);//将秒和纳秒调整为0
        System.out.println(at);
        LocalDate lastday = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());//本月最后1天
        System.out.println(lastday);
        LocalDate firstSunday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY));//本月第一个周日
        System.out.println(firstday);
    }
### 4.3判断日期和时间先后 * isBefore() * isAfter() * equals()
    public static void main(String[] args) {
        LocalDate d1 = LocalDate.of(2016,11,20);
        LocalDate d2 = LocalDate.of(2016,11,21);
        System.out.println(d1.isBefore(d2));
        System.out.println(d1.isAfter(d2));
        System.out.println(d1.equals(d2));
    }

4.4Period计算2个时期相差多少

  • getYears()
  • getMonths()
  • getDays()
    public static void main(String[] args) {
        LocalDate d1 = LocalDate.of(2016,11,20);
        LocalDate d2 = LocalDate.of(2050,1,1);
        Period p = d1.until(d2);
        System.out.println(p);//P33Y1M12D ,即相差33年1月12天
        System.out.println("年"+p.getYears()+"月"+p.getMonths()+"日"+p.getDays());
        System.out.println((d2.toEpochDay()-d1.toEpochDay())+"天");
    }

示例:
代码1:

    public static void main(String[] args) {
        LocalDate d1 = LocalDate.now();
        System.out.println(d1);
        System.out.println("week="+d1.getDayOfWeek().getValue());//打印周几
        LocalDate d2 = LocalDate.of(2016,11,30);
        LocalTime t2 = LocalTime.of(15,16,17);
        LocalDateTime dt2 = LocalDateTime.of(d2,t2);
        System.out.println(dt2);
    }

5.总结:

LocalDate、LocalTime和LocalDateTime:

  • 不变类(类似String)
  • 默认按ISO 8601标准格式化和解析
  • 使用DateTimeFormatter自定义格式化和解析
  • 使用plusDays()/minusHours()等方法对日期和时间进行加减、返回新对象
  • 使用withDayOfMonth()/with()等方法调整日期和时间,返回新对象
  • 使用isBefore()/isAfter()/equals()判断日期和时间的先后

注意:LocalDateTime无法与long进行转换:

  • 因为LocalDateTime没有时区,无法确定某一时刻
  • ZonedDateTime有时区,可以与long进行转换
posted on 2019-04-11 19:10  singleSpace  阅读(316)  评论(0编辑  收藏  举报