zoukankan      html  css  js  c++  java
  • 日期时间类

            java 8新增了LocalDateLocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。

    java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。

    java.util.DateSimpleDateFormatter不是线程安全的,而LocalDateLocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。

    java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java 8中,日期和时间被明确划分为LocalDateLocalTimeLocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。

    新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。

    LocalDate

    看看新的LocalDate怎么用:

    // 取当前日期:
    LocalDate today = LocalDate.now(); // -> 2014-12-24
    // 根据年月日取日期,12月就是12:
    LocalDate crischristmas = LocalDate.of(2014, 12, 25); // -> 2014-12-25
    // 根据字符串取:
    LocalDate endOfFeb = LocalDate.parse("2014-02-28"); // 严格按照ISO yyyy-MM-dd验证,02写成2都不行,当然也有一个重载方法允许自己定义格式
    LocalDate.parse("2014-02-29"); // 无效日期无法通过:DateTimeParseException: Invalid date

    日期转换经常遇到,比如:

    // 取本月第1天:
    LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth()); // 2014-12-01
    // 取本月第2天:
    LocalDate secondDayOfThisMonth = today.withDayOfMonth(2); // 2014-12-02
    // 取本月最后一天,再也不用计算是28,29,30还是31:
    LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth()); // 2014-12-31
    // 取下一天:
    LocalDate firstDayOf2015 = lastDayOfThisMonth.plusDays(1); // 变成了2015-01-01
    // 取2015年1月第一个周一,这个计算用Calendar要死掉很多脑细胞:
    LocalDate firstMondayOf2015 = LocalDate.parse("2015-01-01").with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY)); // 2015-01-05

    LocalTime

    LocalTime只包含时间,以前用java.util.Date怎么才能只表示时间呢?答案是,假装忽略日期。

    LocalTime包含毫秒:

    LocalTime now = LocalTime.now(); // 11:09:09.240

    你可能想清除毫秒数:

    LocalTime now = LocalTime.now().withNano(0)); // 11:09:09

    构造时间也很简单:

    LocalTime zero = LocalTime.of(0, 0, 0); // 00:00:00
    LocalTime mid = LocalTime.parse("12:00:00"); // 12:00:00


    LocalDateTime
    包含日期和时间
    // LocalDateTime就是LocalDate+LocalTime
    // 创建LocalDateTime的几种方式
    LocalDateTime localDateTime = LocalDateTime.now();
    LocalDateTime localDateTime1 = LocalDateTime.of(2020, Month.APRIL, 4, 14, 46, 56);
    LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
    LocalDateTime localDateTime3 = localDate.atTime(localTime);
    LocalDateTime localDateTime4 = localTime.atDate(localDate);
    // 从LocalDateTime获取LocalDate和LocalTime
    LocalDate localDate4 = localDateTime.toLocalDate();
    LocalTime localTime2 = localDateTime.toLocalTime();

    格式化LocalDate和解析字符串到LocalDate

    // 格式化时间 DateTimeFormatter是线程安全的,SimpleDateFormat是线程不安全的
    // 使用DateTimeFormatter提供的默认的模板
    String s1 = localDate.format(DateTimeFormatter.BASIC_ISO_DATE); // yyyyMMdd
    String s2 = localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); // yyyy-MM-dd
    //自定义格式化
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    String s3 = localDate.format(dateTimeFormatter);
    
    // 解析时间
    LocalDate localDate5 = LocalDate.parse("20200414", DateTimeFormatter.BASIC_ISO_DATE);
    LocalDate localDate6 = LocalDate.parse("2020-04-14", DateTimeFormatter.ISO_LOCAL_DATE);

    LocalDate的加减法

    LocalDate的加减法,有加减天数,月,周,年

    对应的方法是plusDays(long),plusMonths(long),plusYears(long),plusWeeks(long),plus(1, ChronoUnit.YEARS),

    minusDays(long),minusMonths(long),minusYears(long),minusWeeks(long),minus(1, ChronoUnit.MONTHS)

    plus和minus也适用于 LocalTime,LocalDateTime 

    通过with修改某些值

    只修改年,不修改月日

    LocalDate localDate = LocalDate.now();
    //修改年为2021  
    localDate = localDate.withYear(2021);  
    //修改为2022  
    localDate = localDate.with(ChronoField.YEAR, 2022);
  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/hup666/p/13216078.html
Copyright © 2011-2022 走看看