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);
    }
}

相关文章
|
2天前
|
数据采集 JSON Java
Java爬虫获取微店快递费用item_fee API接口数据实现
本文介绍如何使用Java开发爬虫程序,通过微店API接口获取商品快递费用(item_fee)数据。主要内容包括:微店API接口的使用方法、Java爬虫技术背景、需求分析和技术选型。具体实现步骤为:发送HTTP请求获取数据、解析JSON格式的响应并提取快递费用信息,最后将结果存储到本地文件中。文中还提供了完整的代码示例,并提醒开发者注意授权令牌、接口频率限制及数据合法性等问题。
|
2天前
|
数据采集 存储 Java
Java爬虫获取微店店铺所有商品API接口设计与实现
本文介绍如何使用Java设计并实现一个爬虫程序,以获取微店店铺的所有商品信息。通过HttpClient发送HTTP请求,Jsoup解析HTML页面,提取商品名称、价格、图片链接等数据,并将其存储到本地文件或数据库中。文中详细描述了爬虫的设计思路、代码实现及注意事项,包括反爬虫机制、数据合法性和性能优化。此方法可帮助商家了解竞争对手,为消费者提供更全面的商品比较。
|
24天前
|
算法 Java 程序员
菜鸟之路Day06一一Java常用API
《菜鸟之路Day06——Java常用API》由blue编写,发布于2025年1月24日。本文详细介绍了Java中常用的API,包括JDK7的时间类(Date、SimpleDateFormat、Calendar)和JDK8新增的时间API(ZoneId、Instant、DateTimeFormatter等),以及包装类的使用。通过多个实例练习,如时间计算、字符串转整数、十进制转二进制等,帮助读者巩固所学内容,提升编程技能。文章强调了理论与实践结合的重要性,鼓励读者多做练习以提高学习效率。
76 28
|
6天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
31 5
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
6天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
12天前
|
JSON API 数据格式
微店商品列表接口(微店 API 系列)
微店商品列表接口是微店API系列的一部分,帮助开发者获取店铺中的商品信息。首先需注册微店开发者账号并完成实名认证,选择合适的开发工具如PyCharm或VS Code,并确保熟悉HTTP协议和JSON格式。该接口支持GET/POST请求,主要参数包括店铺ID、页码、每页数量和商品状态等。响应数据为JSON格式,包含商品详细信息及状态码。Python示例代码展示了如何调用此接口。应用场景包括商品管理系统集成、数据分析、多平台数据同步及商品展示推广。
|
4天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
26 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
3天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
46 23
|
4天前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
51 21