【Java8】新的日期和时间API

news2025/6/15 16:49:28

【Java8】新的日期和时间API

    • 前言
      • 为什么要设计新的API?
    • 使用LocalDate、LocalTime、LocalDateTime
      • LocalDate
      • LocalTime
      • LocalDateTime 合并日期和时间
      • 改变日期
      • 打印输出及解析日期-时间对象
      • Date和LocalDate、LocalDateTime转换

《Java8实战》读书笔记

前言

为什么要设计新的API?

已有的日期类Date、Calendar设计有缺陷

  • 非线程安全
  • 易用性: 年份从1900开始,月份从1开始,天从0开始,不是很直观;
    DateFromat只有Date类中有
  • 提供的计算方法比较少

因此,Java8引入java.time提供了新的类,LocalDate、LocalTime、LocalDateTime、Instant、Duration、Period

使用LocalDate、LocalTime、LocalDateTime

LocalDate

//创建
LocalDate localDate = LocalDate.of(2023, 4, 1);
LocalDate parse = LocalDate.parse("2023-04-01");
LocalDate now = LocalDate.now();

//获取年、月、日 //后边的方法也一样的用
int year = now.getYear(); //now.get(ChronoField.YEAR)
int month = now.getMonth().getValue(); // now.getMonthValue(); //now.get(ChronoField.MONTH_OF_YEAR)
int day = now.getDayOfMonth(); // now.get(ChronoField.DAY_OF_MONTH);

System.out.println(now);
System.out.println(year);
System.out.println(month);
System.out.println(day);

//输出
2023-04-02
2023
4
2

LocalTime

//创建对象
LocalTime time1 = LocalTime.of(22, 3, 30);
LocalTime time2 = LocalTime.parse("22:03:30")
LocalTime time = LocalTime.now();

//获取时、分、秒  //后边的也一样的用
int hour = time.getHour(); //time.get(ChronoField.HOUR_OF_DAY)
int minute = time.getMinute(); //time.get(ChronoField.MINUTE_OF_HOUR);
int second = time.getSecond(); //time.get(ChronoField.SECOND_OF_MINUTE);

System.out.println(time);
System.out.println(hour);
System.out.println(minute);
System.out.println(second);

//输出
22:05:45.920
22
5
45

LocalDateTime 合并日期和时间

//创建
LocalDateTime d1 = LocalDateTime.of(2023, 4, 2, 22, 40, 30);
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
//组合日期和时间
LocalDateTime d2 = LocalDateTime.of(date, time);
//日期组合时间
LocalDateTime d3 = date.atTime(time);
LocalDateTime d4 = date.atTime(22, 40, 30);
//时间组合日期
LocalDateTime d5 = time.atDate(date);
//直接now
LocalDateTime now = LocalDateTime.now(); //2023-04-09T10:31:14.453

//获取日期 LocalDate 
LocalDate date6 = now.toLocalDate(); //2023-04-09
//获取时间 LocalTime 
LocalTime time6 = now.toLocalTime(); //10:31:14.453

改变日期

如果你已经有一个LocalDate对象,想要创建它的一个修改版,最直接也最简单的方法是使用withAttribute方法。
withAttribute方法会创建对象的一个副本,并按照需要修改它的属性。
注意,下面的这段代码中所有的方法都返回一个修改了属性的对象。它们都不会修改原来的对象!

  1. 直接修改对象(复制新对象修改,原对象不变)
        //2023-04-01
        LocalDate date = LocalDate.of(2023, 4, 1);
        //2018-04-01
        LocalDate d1 = date.withYear(2018);
        //2023-12-01
        LocalDate d2 = date.withMonth(12);
        //2023-04-20
        LocalDate d3 = date.withDayOfMonth(20);
        //2023-04-20
        LocalDate d4 = date.with(ChronoField.DAY_OF_MONTH, 20);
  1. 相对的加减(复制新对象修改,原对象不变)
        //2023-04-01
        LocalDate date = LocalDate.of(2023, 4, 1);
        //2023-04-04
        LocalDate d1 = date.plusDays(3);
        //2021-04-01
        LocalDate d2 = date.minusYears(2);
        //2023-04-04
        LocalDate d3 = date.plus(3, ChronoUnit.DAYS);

在这里插入图片描述

  1. 复杂操作 TemporalAdjuster

将日期调整到下个周日、下个工作日,或者是本月的最后一天。这时,你可以使用重载版本的with方法,向其传递一个提供了更多定制化选择的TemporalAdjuster对象,更加灵活地处理日期。对于最常见的用例,日期和时间API已经提供了大量预定义的TemporalAdjuster。你可以通过TemporalAdjuster类的静态工厂方法访问它

        LocalDate date = LocalDate.of(2023, 4, 1);
        //下周一  2023-04-03
        LocalDate d1 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
        //这个月最后一天2023-04-30
        LocalDate d2 = date.with(TemporalAdjusters.lastDayOfMonth()); 

更多静态方法如下;
在这里插入图片描述
也可以自定义方法来实现TemporalAdjuster接口,实现自己的转换。

打印输出及解析日期-时间对象

LocalDate now = LocalDate.of(2023,4,3);
//将日期转换成字符串

//20230403
String format1 = now.format(DateTimeFormatter.BASIC_ISO_DATE); 
//2023-04-03
String format2 = now.format(DateTimeFormatter.ISO_LOCAL_DATE); 

//将字符串转换成日期(用内置的静态实例)
LocalDate date1=LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE);
LocalDate date2=LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
System.out.println(date1);
System.out.println(date2);

//DateTimeFormatter.ofPattern(用指定字符串格式解析格式化)
DateTimeFormatter formatter=DateTimeFormatter.ofPattern("dd MM/yyyy");
//18 03/2014
String formattedDate=date1.format(formatter);
LocalDate date3=LocalDate.parse(formattedDate, formatter);

//自定义DateTimeFormatter(通过DateTimeFormatterBuilder自己编程实现)
DateTimeFormatter italianFormatter=new DateTimeFormatterBuilder()
        .appendText(ChronoField.DAY_OF_MONTH)
        .appendLiteral(". ")
        .appendText(ChronoField.MONTH_OF_YEAR)
        .appendLiteral(" ")
        .appendText(ChronoField.YEAR)
        .parseCaseInsensitive()
        .toFormatter(Locale.ITALIAN);

Date和LocalDate、LocalDateTime转换

//1、LocalDate和Date互转
//1.1 LocalDate -> Date
LocalDate localDate = LocalDate.now();
Date date = Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
//1.2 Date -> LocalDate
Date date1 = new Date();
LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

//2.1 LocalDateTime -> Date
LocalDateTime localDateTime = LocalDateTime.now();
Date date2 = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
//2.2 date -> LocalDateTime
Date date3 = new Date();
LocalDateTime localDateTime1 = date3.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

还有一些涉及时区的类,没有记录;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/412126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十二载征程犹未止,看今朝星光尽闪耀丨万字长文回顾2023数据技术嘉年华

4月8日下午,为期两天的第十二届数据技术嘉年华(DTC 2023)在北京新云南皇冠假日酒店圆满落下帷幕。大会得到了工业和信息化部电子五所的支持和指导,围绕“开源融合数字化——引领数据技术发展,释放数据要素价值”这一主…

基于Spring Boot和Vue3打造一个属于自己的博客平台CodeInsight

CodeInsight是一个基于Spring Boot和Vue3技术栈的博客平台,为开发者和技术爱好者提供了一个专注于现代编程技术分享与学习的高质量平台。在本文中,我们将详细介绍CodeInsight的特点、功能模块以及付费专栏内容。 目录: 《用户体验与交互设计实践》 用户模…

AI新宠:Prompt Learning,用提示学习调教大模型

“提示学习”对于很多人来说都是新名词,Prompt Learning 和 Prompting 这两者之间有什么区别和联系呢?现在的一些大模型如何利用“提示语言”呢?本期直播课为大家做了详细介绍,从 AI 范式的一个变迁,到提示学习&#x…

LVGL V9.0基于VS2022仿真搭建(2)

完整Demo,lvgl,lvgl_drivers相关资料下载 链接:https://pan.baidu.com/s/1h3OKCIBQRX0Hn7KjZsynqg 提取码:sc2l 下载的lv_drivers中的win32drv.c及win32drv.h文件是做了修改的,官网下载的lv_drivers编译会报错,因为l…

数据类型。

数据类型分为简单数据类型(值类型)和复杂数据类型(引用类型)值类型:在存储时变量中存储的是值本身(string、number、boolean、undefined、null(null特殊,返回一个空的对象 object&am…

2023年第十三届MathorCup高校数学建模挑战赛|A题|量子计算机在信用评分卡组合优化中的应用

目录 题目详情 最终收入 贷款利息收入 - 坏账损失 赛题说明 1:流程简化及示例 赛题说明 2:QUBO 模型简介 赛题说明 3:赛题数据 问题​ 题目详情 在银行信用卡或相关的贷款等业务中,对客户授信之前,需…

mycat2安装配置,分库分表,一库多表

1、官网下载(官网下载地址) 官网下载地址 Index of /2.0/ 下载模板 下载jdk包 下载好后吧jdk包房到mycat的lib目录下 2、配置启动 配置结构 mycat配置文件夹 clusters- prototype.cluster.json //无集群的时候自动创建- c0.cluster.json- c1.cluster…

jupyter notebook笔记 visualpython

通过界面拖拽生成Python代码 0 安装 pip install visualpythonvisualpy install 出现橙色按钮即为成功 1 主界面 2 logic 一些简单的逻辑运算 以class 为例: 3 Data Analysis 3.1 import 3.2 File(数据集) 3.2.1 读本地文件 3.2.2 写…

【两阶段鲁棒优化】利用列-约束生成方法求解两阶段鲁棒优化问题(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

基于深度学习的农作物叶片病害检测系统(UI界面+YOLOv5+训练数据集)

摘要:农作物叶片病害检测系统用于智能检测常见农作物叶片病害情况,自动化标注、记录和保存病害位置和类型,辅助作物病害防治以增加产值。本文详细介绍基于YOLOv5深度学习模型的农作物叶片病害检测系统,在介绍算法原理的同时&#…

能够翻译文档的免费软件-免费翻译整个文档的软件

chatgpt怎么实现批量翻译 ChatGPT是一种基于人工智能技术的自然语言处理软件,可以实现快速、准确的批量翻译操作,同时也支持多种语言翻译。下面是 ChatGPT 的批量翻译操作流程: 步骤 1: 确定翻译语言和翻译文本 首先需要确定要翻译的原文本…

套接字通信基础

套接字通信基础概述套接字通信基础套接字类型socket模型创建流程分析套接字创建socket()套接字绑定bind()套接字监听listen()套接字接受连接请求accept套接字连接套接字数据传输套接字通信实例服务器端代码客户端代码应用场景总结概述 套接字通信是在Linux系统中实现进程间通信…

WinForms 网格控件 - iGrid.NET 10.1.22 Crack

WinForms 网格控件 - iGrid.NET WinForms 的 10Tec 网格介绍 iGrid.NET 是适用于 Windows Forms 平台的多功能WinForms 网格控件,它是 Microsoft .NET Framework 和 .NET Core 的一部分。软件开发人员使用 iGrid for WinForms 来构建高度可调整的表格界面。它速度…

【MATLAB图像处理实用案例详解(10)】——基于Kalman滤波的目标跟踪预测红色小球位置

目录一、Kalman滤波二、Kalman滤波源程序三、Kalman滤波预测红色小球位置程序实现一、Kalman滤波 Kalman 滤波算法是一个最优化自回归数据处理算法,对于很多问题的解決,它是最优、效率最高甚至是最有用的。Kalman 滤波的广泛应用己经超过30年&#xff0…

LeetCode-120. 三角形最小路径和

目录题目思路动态规划(由上到下)动态规划(由下到上)题目来源 120. 三角形最小路径和 题目思路 由上往下 动态规划(由上到下) 1.确定dp数组以及下标的含义 dp[i][j] 表示从点 (i,j)) 到底边的最小路径和。 2.确定递推公式 常规: triangle[i][j]一定会经过tri…

SQL语句性能分析

1. 数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢?这里把思考的流程整理成下面这张图。 整个流程划分成了 观察(Show status) 和 行动(Action) 两个部分。字母 S 的部分代表观察&…

连续可调稳压升压电源模块12v转12kv 24v转15kv 12v转5000v

GRB系列高压电源模块是一款工业级高性能微型DC/DC电源模块,是目前全球实 现输出连续可调稳压1000-15000V的超小体积的高压电源模块。具有体积小、功 耗低、响应快、输出纹波低、输出稳定度高、输出电压宽范围可调、自带过流保 护等优点,是一款专门为工业…

uniapp 之 小球根据当前时间 显示位置

目录 效果图 前言 总代码 1. template 代码 2. script 代码 3. js文件 4.样式 注解 1.小球运动代码 2. picker 时间选择器 补充 效果图 前言 最里面的是一张图片&#xff0c;并不是手写的样式&#xff0c; 总代码 1. template 代码 <uni-popup ref"appointm…

一图看懂 stat 模块:解析 stat() 结果, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 [TOC](一图看懂 stat 模块&#xff1a;解析 stat() 结果, 资料整理笔记&#xff08;大全&#xff09;) 摘要 全文介绍系统内置 stat 模块、函数、类及类的方法和属性。 它通过代码抓…

通过自动化和条形码优化供应链

Welch Allyn是全球领先的医疗诊断设备制造商&#xff0c;开发了数百种突破性产品和技术&#xff0c;使一线从业者能够提供卓越的患者护理。它在26个不同的国家拥有近2&#xff0c;500名员工。 一、面临的挑战提高运营效率 原因&#xff1a;用户需要长途跋涉并浏览多个数据条目以…