Java8-日期时间API

与旧版Java的日期API比较

在旧版的 Java 中,日期时间 API 存在诸多问题,其中有:

  1. 非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一。

  2. 设计很差 − Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。

  3. 时区处理麻烦 − 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  1. Local(本地) − 简化了日期时间的处理,没有时区的问题。
  2. Zoned(时区) − 通过制定的时区处理日期时间。
  3. 描述:
  • Instant——它代表的是时间戳
  • LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
  • LocalTime——它代表的是不含日期的时间
  • LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
  • ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。

类型转换

/**
     * 日期时间转字符串
     * @return
     */
    public static String parseDateToString() {
    
    
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime now = LocalDateTime.now();
        String nowText = now.format(formatter);
        return nowText;
    }

    /**
     * 字符串转日期时间
     * @return
     */
    public static LocalDateTime parseStringToDate() {
    
    
        String datetimeText = "1999-12-31 23:59:59";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime datetime = LocalDateTime.parse(datetimeText, formatter);
        return datetime;
    }

Demo基础案例

public static void main(String[] args) {
    
    
        //获取日期
        LocalDate date = LocalDate.now();
        System.out.println(date); // 2021-01-30
        System.out.printf("\n年=%d,月=%d,日=%d", date.getYear(), date.getMonthValue(), date.getDayOfMonth());

        // 指定构造日期
        LocalDate date1 = LocalDate.of(2000, 1, 1);
        System.out.println("\n千禧年=" + date1);//千禧年=2000-01-01
        System.out.println("\n日期是否相等:"+date1.equals(date));

        // 时间增量
        LocalTime time = LocalTime.now();
        LocalTime newTime = time.plusHours(2);//增加2个小时
        System.out.println("\nnewTime=" + newTime); //newTime=12:34:38.584

        // 日期增量
        LocalDate date2 = LocalDate.now();
        LocalDate newDate = date2.plus(1, ChronoUnit.WEEKS);//增加一周7天
        System.out.println("\nnewDate=" + newDate);// newDate=2021-02-06

        //Java 8不仅分离了日期和时间,也把时区分离出来了。
        // 现在有一系列单独的类如ZoneId来处理特定时区,ZoneDateTime类来表示某时区下的时间。
        ZoneId shanghaiZoneId = ZoneId.of("Asia/Shanghai");// 上海时间
        ZonedDateTime shanghaiZonedDateTime = ZonedDateTime.now(shanghaiZoneId);
        ZoneId tokyoZoneId = ZoneId.of("Asia/Tokyo");// 东京时间
        ZonedDateTime tokyoZonedDateTime = ZonedDateTime.now(tokyoZoneId);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("\n上海时间: " + shanghaiZonedDateTime.format(formatter));
        System.out.println("\n东京时间: " + tokyoZonedDateTime.format(formatter));

        // 解析日期
        String dateText = "20180924";
        LocalDate date3 = LocalDate.parse(dateText, DateTimeFormatter.BASIC_ISO_DATE);
        System.out.println("\n格式化之后的日期=" + date3);// 格式化之后的日期=2018-09-24

        // 格式化日期
        dateText = date3.format(DateTimeFormatter.ISO_DATE);
        System.out.println("\ndateText=" + dateText);//dateText=2018-09-24

        //日期时间比较->isAfter()、isBefore()用于判断当前日期时间和指定日期时间的比较
        LocalDate now = LocalDate.now();
        LocalDate date4 = LocalDate.of(2000, 1, 1);
        if (now.isAfter(date4)) {
    
    
            System.out.println("\n2000年已经过去了");
        }
        LocalDate date5 = LocalDate.of(2020, 1, 1);
        if (now.isBefore(date5)) {
    
    
            System.out.println("\n2020年还未到来");
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_39182939/article/details/113443574