Java8新特性——新一套日期时间API

简介: Java8新特性——新一套日期时间API

文章目录:


1.旧对比(线程安全问题)

2.LocalDate

3.LocalTime

4.LocalDateTime

5.Instant

6.DurationPeriod

7.TestTemporalAdjusterTestTemporalAdjusters

8.DateTimeFormatter

1.新旧对比(线程安全问题)


我们先来看下面的代码:👇👇👇(关于代码中某些类中的某些方法,我在这里就不说了,大家可以去查找api文档)

package com.szh.java8.datetime;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
/**
 *
 */
public class TestSimpleDateFormat {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Callable<Date> task1 = new Callable<Date>() {
            @Override
            public Date call() throws Exception {
                return sdf.parse("20211109");
            }
        };
        ExecutorService pool1 = Executors.newFixedThreadPool(10);
        List<Future<Date>> futureList1 = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            futureList1.add(pool1.submit(task1));
        }
        for (Future<Date> future : futureList1) {
            System.out.println(future.get());
        }
        pool1.shutdown();
        //=================================================================
//        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
//
//        Callable<LocalDate> task2 = new Callable<LocalDate>() {
//            @Override
//            public LocalDate call() throws Exception {
//                return LocalDate.parse("20211109",dtf);
//            }
//        };
//
//        ExecutorService pool2 = Executors.newFixedThreadPool(10);
//        List<Future<LocalDate>> futureList2 = new ArrayList<>();
//        for (int i = 0; i < 10; i++) {
//            futureList2.add(pool2.submit(task2));
//        }
//
//        for (Future<LocalDate> future : futureList2) {
//            System.out.println(future.get());
//        }
//
//        pool2.shutdown();
    }
}

运行之后,就出现了线程安全问题。


将代码中的上半部分注释掉,然后打开下半部分的代码,再次运行,线程安全问题就不存在了。

也就是Java8中提供了新一套日期时间API已经解决了线程安全问题。

2.LocalDate


package com.szh.java8.datetime;
import java.time.LocalDate;
/**
 *
 */
public class TestLocalDate {
    public static void main(String[] args) {
        LocalDate ld1 = LocalDate.now();
        System.out.println(ld1);
        LocalDate ld2 = LocalDate.of(2021,5,1);
        System.out.println(ld2);
        LocalDate ld3 = ld1.plusYears(20);
        System.out.println(ld3);
        LocalDate ld4 = ld1.minusMonths(3);
        System.out.println(ld4);
        System.out.println(ld1.isBefore(ld2));
        System.out.println(ld2.isAfter(ld1));
        System.out.println(ld1.isLeapYear());
        System.out.println("年:" + ld1.getYear() + ", 月:" + ld1.getMonth() + ", 日:" + ld1.getDayOfMonth());
        System.out.println("年:" + ld1.getYear() + ", 月:" + ld1.getMonthValue() + ", 日:" + ld1.getDayOfMonth());
    }
}


3.LocalTime


package com.szh.java8.datetime;
import java.time.LocalTime;
/**
 *
 */
public class TestLocalTime {
    public static void main(String[] args) {
        LocalTime lt1 = LocalTime.now();
        System.out.println(lt1);
        LocalTime lt2 = LocalTime.of(13,14,15);
        System.out.println(lt2);
        LocalTime lt3 = lt2.plusHours(3);
        System.out.println(lt3);
        LocalTime lt4 = lt2.minusMinutes(14);
        System.out.println(lt4);
        System.out.println(lt1.isBefore(lt2));
        System.out.println(lt2.isAfter(lt1));
        System.out.println("小时:" + lt1.getHour() + ", 分钟:" + lt1.getMinute() + ", 秒:" + lt1.getSecond());
    }
}


4.LocalDateTime


package com.szh.java8.datetime;
import java.time.LocalDateTime;
/**
 *
 */
public class TestLocalDateTime {
    public static void main(String[] args) {
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);
        LocalDateTime ldt2 = LocalDateTime.of(2020,5,1,13,14,15);
        System.out.println(ldt2);
        LocalDateTime ldt3 = ldt1.plusYears(15);
        System.out.println(ldt3);
        LocalDateTime ldt4 = ldt1.minusDays(20);
        System.out.println(ldt4);
        System.out.println(ldt1.isBefore(ldt2));
        System.out.println(ldt2.isAfter(ldt1));
        System.out.println("年:" + ldt2.getYear() + ", 月:" + ldt2.getMonthValue() + ", 日:" + ldt2.getDayOfMonth()
                + ", 小时:" + ldt2.getHour() + ", 分钟:" + ldt2.getMinute() + ", 秒:" + ldt2.getSecond());
    }
}


5.Instant


package com.szh.java8.datetime;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
/**
 * Instant : 时间戳(使用 Unix 元年  1970年1月1日 00:00:00 所经历的毫秒值)
 *           默认使用 UTC 时区
 */
public class TestInstant {
    public static void main(String[] args) {
        Instant instant1 = Instant.now();
        System.out.println(instant1);
        OffsetDateTime odt = instant1.atOffset(ZoneOffset.ofHoursMinutesSeconds(8,16,32));
        System.out.println(odt);
        System.out.println(instant1.getEpochSecond());
        System.out.println(instant1.toEpochMilli());
        Instant instant2 = Instant.ofEpochSecond(1000);
        System.out.println(instant2);
        Instant instant3 = instant1.plusSeconds(30);
        System.out.println(instant3);
        Instant instant4 = instant1.minusSeconds(50);
        System.out.println(instant4);
    }
}


6.Duration、Period


package com.szh.java8.datetime;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.Period;
/**
 * Period : 用于计算两个“日期”间隔
 * Duration : 用于计算两个“时间”间隔
 */
public class TestPeriodDuration {
    public static void main(String[] args) {
        LocalDate ld1 = LocalDate.now();
        LocalDate ld2 = LocalDate.of(2020,5,1);
        Period period = Period.between(ld2,ld1);
        System.out.println("两个日期相差:" + period.getYears() + "年," + period.getMonths() + "个月,"
                            + period.getDays() + "天....");
        System.out.println(period.isNegative()); //检查此期间的三个单位是否为负
        System.out.println(period.isZero()); //检查此期间的所有三个单位是否为零
        System.out.println("--------------------------------------------");
        LocalTime lt1 = LocalTime.now();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LocalTime lt2 = LocalTime.now();
        Duration duration = Duration.between(lt1,lt2);
        System.out.println("两个时间相差:" + duration.toHours() + "个小时," + duration.toMinutes() + "分钟,"
                            + duration.getSeconds() + "秒....");
        System.out.println(duration.isNegative()); //检查此期间的三个单位是否为负
        System.out.println(duration.isZero()); //检查此期间的所有三个单位是否为零
    }
}


7.TestTemporalAdjuster、TestTemporalAdjusters


package com.szh.java8.datetime;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
/**
 *  TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下个周日”等操作。
 *  TemporalAdjusters : 该类通过静态方法提供了大量的常用 TemporalAdjuster 的实现。
 */
public class TestTemporalAdjuster {
    public static void main(String[] args) {
        LocalDateTime ldt1 = LocalDateTime.now();
        System.out.println(ldt1);
        LocalDateTime ldt2 = ldt1.withMonth(5);
        System.out.println(ldt2);
        LocalDateTime ldt3 = ldt1.with(TemporalAdjusters.next(DayOfWeek.SATURDAY));
        System.out.println(ldt3);
        //自定义:下一个工作日
        LocalDateTime ldt4 = ldt1.with((l) -> {
            LocalDateTime ldt5 = (LocalDateTime) l;
            DayOfWeek dow = ldt5.getDayOfWeek();
            if (dow.equals(DayOfWeek.FRIDAY)) {
                return ldt5.plusDays(3);
            } else if (dow.equals(DayOfWeek.SATURDAY)) {
                return ldt5.plusDays(2);
            } else {
                return ldt5.plusDays(1);
            }
        });
        System.out.println(ldt4);
    }
}


8.DateTimeFormatter


package com.szh.java8.datetime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
 * 解析与格式化
 */
public class TestDateTimeFormatter {
    public static void main(String[] args) {
        DateTimeFormatter dtf1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        LocalDateTime ldt1 = LocalDateTime.now();
        String strDate1 = ldt1.format(dtf1);
        System.out.println(strDate1);
        System.out.println("-----------------------------------");
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
        String strDate2 = ldt1.format(dtf2);
        System.out.println(strDate2);
        System.out.println("-----------------------------------");
        LocalDateTime newDate = ldt1.parse(strDate2, dtf2);
        System.out.println(newDate);
    }
}

相关文章
|
4月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
76 4
|
2月前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
93 6
|
3月前
|
安全 Java API
告别SimpleDateFormat:Java 8日期时间API的最佳实践
在Java开发中,处理日期和时间是一个基本而重要的任务。传统的`SimpleDateFormat`类因其简单易用而被广泛采用,但它存在一些潜在的问题,尤其是在多线程环境下。本文将探讨`SimpleDateFormat`的局限性,并介绍Java 8引入的新的日期时间API,以及如何使用这些新工具来避免潜在的风险。
53 5
|
4月前
|
缓存 JavaScript 前端开发
深入理解 Vue 3 的 Composition API 与新特性
本文详细探讨了 Vue 3 中的 Composition API,包括 setup 函数的使用、响应式数据管理(ref、reactive、toRefs 和 toRef)、侦听器(watch 和 watchEffect)以及计算属性(computed)。我们还介绍了自定义 Hooks 的创建与使用,分析了 Vue 2 与 Vue 3 在响应式系统上的重要区别,并概述了组件生命周期钩子、Fragments、Teleport 和 Suspense 等新特性。通过这些内容,读者将能更深入地理解 Vue 3 的设计理念及其在构建现代前端应用中的优势。
80 1
深入理解 Vue 3 的 Composition API 与新特性
|
3月前
|
JavaScript 前端开发 API
Vue 3新特性详解:Composition API的威力
【10月更文挑战第25天】Vue 3 引入的 Composition API 是一组用于组织和复用组件逻辑的新 API。相比 Options API,它提供了更灵活的结构,便于逻辑复用和代码组织,特别适合复杂组件。本文将探讨 Composition API 的优势,并通过示例代码展示其基本用法,帮助开发者更好地理解和应用这一强大工具。
54 2
|
5月前
|
存储 JavaScript 前端开发
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
该文章深入探讨了Vue3中Composition API的关键特性,包括`ref`、`toRef`、`toRefs`的使用方法与场景,以及它们如何帮助开发者更好地管理组件状态和促进逻辑复用。
敲黑板!vue3重点!一文了解Composition API新特性:ref、toRef、toRefs
|
5月前
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
5月前
|
SQL Java Linux
Java 8 API添加了一个新的抽象称为流Stream
Java 8 API添加了一个新的抽象称为流Stream
|
IDE Java 关系型数据库
Java14发布,16大新特性,代码更加简洁明快
Java14发布,16大新特性,代码更加简洁明快
336 0
Java14发布,16大新特性,代码更加简洁明快
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
97 17