当前位置: 首页 > news >正文

23.Java 时间日期扩展(新时间日期、新时间日期格式化与解析、时间戳、计算时间日期差、时间矫正器、时区)

一、旧时间日期问题

  1. 在 java.util 和 java.sql 包下都有时间日期类

    • java.util.Date 类包含时间和日期

    • java.sql.Date 类值包含日期

  2. java.util.Date 类线程不安全,Date 对象可变

  3. 时间日期格式化类在 java.text 包下

  4. 时区处理困难,并不支持国际化,没有时区支持

package com.my.olddate;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class OldDateTest {public static void main(String[] args) {// 设计不合理Date date = new Date(2022, 7, 30);System.out.println(date); // Wed Aug 30 00:00:00 CST 3922System.out.println("--------------------");// 存在线程安全问题SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");for (int i = 0; i < 50; i++) {new Thread(() -> {try {System.out.println(simpleDateFormat.parse("2022-07-30"));} catch (ParseException e) {e.printStackTrace();}}).start();}}
}

二、新时间日期概述

1、基本介绍
  • JDK 8 增加了一套全新的时间日期 API,这套 API 设计合理,线程安全

  • 新时间日期 API 位于 java.time 包下

2、关键类介绍
说明
LocalDate日期,年月日
LocalTime时间,时分秒
LocalDateTime日期时间,年月日时分秒
DateTimeFormatter日期时间格式化类
Instant时间戳,时间瞬间
Duration计算时间差
Period计算日期差
ZonedDateTime包含时区的时间
  • Java 中使用的是 ISO 8601 日期和时间的表示方法,是世界民用历法,即公历,平年有 365 天,闰年有 366 天

三、新时间日期操作

1、新时间日期创建
  • 创建指定日期
LocalDate date1 = LocalDate.of(2022, 6, 30);
System.out.println(date1);
  • 创建当前日期
LocalDate date2 = LocalDate.now();
System.out.println(date2);
  • 创建指定时间
LocalTime time1 = LocalTime.of(15, 30, 30, 123);
System.out.println(time1);
  • 创建当前时间
LocalTime time2 = LocalTime.now();
System.out.println(time2);
  • 创建指定日期时间
LocalDateTime localDateTime1 = LocalDateTime.of(2022, 6, 30, 15, 30, 30, 123);
System.out.println(localDateTime1);
  • 创建当前日期时间
LocalDateTime localDateTime2 = LocalDateTime.now();
System.out.println(localDateTime2);
2、新时间日期信息获取
  • LocalDate 对象信息获取
LocalDate localDate = LocalDate.now();System.out.println("年:" + localDate.getDayOfYear());
System.out.println("月:" + localDate.getMonth().getValue() + "  " + localDate.getMonth());
System.out.println("日:" + localDate.getDayOfMonth());
System.out.println("星期:" + localDate.getDayOfWeek().getValue() + "  " + localDate.getDayOfWeek());
  • LocalTime 对象信息获取
LocalTime localTime = LocalTime.now();System.out.println("时:" + localTime.getHour());
System.out.println("分:" + localTime.getMinute());
System.out.println("秒:" + localTime.getSecond());
System.out.println("纳秒:" + localTime.getNano());
  • LocalDateTime 对象信息获取
LocalDateTime localDateTime = LocalDateTime.now();System.out.println("年:" + localDateTime.getDayOfYear());
System.out.println("月:" + localDateTime.getMonth().getValue() + "  " + localDateTime.getMonth());
System.out.println("日:" + localDateTime.getDayOfMonth());
System.out.println("星期:" + localDateTime.getDayOfWeek().getValue() + "  " + localDateTime.getDayOfWeek());
System.out.println("时:" + localDateTime.getHour());
System.out.println("分:" + localDateTime.getMinute());
System.out.println("秒:" + localDateTime.getSecond());
System.out.println("纳秒" + localDateTime.getNano());
3、新时间日期修改
  • 通过设置时间日期进行修改
LocalDateTime now = LocalDateTime.now();System.out.println("当前日期时间:" + now);
System.out.println("修改年:" + now.withYear(2000));
System.out.println("修改月:" + now.withMonth(10));
System.out.println("修改日:" + now.withDayOfMonth(25));
System.out.println("修改时:" + now.withHour(20));
System.out.println("修改分:" + now.withMinute(10));
System.out.println("修改秒:" + now.withSecond(30));
System.out.println("修改纳秒:" + now.withNano(123456));
  • 通过加减时间日期进行修改
LocalDateTime now = LocalDateTime.now();System.out.println("五年后:" + now.plusYears(5));
System.out.println("五个月后:" + now.plusMonths(5));
System.out.println("五天后:" + now.plusDays(5));
System.out.println("五小时后:" + now.plusHours(5));
System.out.println("五分钟后:" + now.plusMinutes(5));
System.out.println("五秒后:" + now.plusSeconds(5));
System.out.println("五纳秒后:" + now.plusNanos(5));System.out.println("--------------------");System.out.println("五年前:" + now.minusYears(5));
System.out.println("五个月前:" + now.minusMonths(5));
System.out.println("五天前:" + now.minusDays(5));
System.out.println("五小时前:" + now.minusHours(5));
System.out.println("五分钟前:" + now.minusMinutes(5));
System.out.println("五秒前:" + now.minusSeconds(5));
System.out.println("五纳秒前:" + now.minusNanos(5));
4、新时间日期线程安全问题
  • 新时间日期类每次修改都会创建新的对象,原来的对象是不会被修改的,不会存在线程安去问题
package com.my.newdate;import java.time.LocalDateTime;public class NewDateSafeTest {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();LocalDateTime localDateTime = now.plusYears(5);System.out.println(now + "  " + now.hashCode());System.out.println(localDateTime + "  " + localDateTime.hashCode());}
}
5、新时间日期比较
package com.my.newdate;import java.time.LocalDateTime;public class NewDateCompareTest {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();LocalDateTime localDateTime = LocalDateTime.of(2020, 1, 1, 15, 30, 30);System.out.println(now.isAfter(localDateTime));System.out.println(now.isBefore(localDateTime));System.out.println(now.isEqual(localDateTime));}
}

四、新时间日期格式化与解析

  • 使用 java.time.format.DateTimeFormatter 进行格式化和解析操作
1、新时间日期格式化
  • 使用系统默认格式进行格式化
LocalDateTime now = LocalDateTime.now();DateTimeFormatter basicIsoDate = DateTimeFormatter.BASIC_ISO_DATE;String format = now.format(basicIsoDate);
System.out.println(format);
  • 使用指定格式进行格式化
LocalDateTime now = LocalDateTime.now();DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String format = now.format(dateTimeFormatter);
System.out.println(format);
2、新时间日期解析
package com.my.newdate;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class NewDateParseTest {public static void main(String[] args) {String str2 = "2022-07-30 17:36:44";DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime localDateTime2 = LocalDateTime.parse(str2, dateTimeFormatter);System.out.println(localDateTime2);}
}

五、时间戳

1、基本介绍
  • Instant 类,时间戳,可以获取从 1970-01-01 00:00:00 起的秒数
2、基本使用
  • 获取时间戳
Instant now = Instant.now();
System.out.println(now);
  • 获取秒数
Instant now = Instant.now();System.out.println(now.getEpochSecond());
  • 获取纳秒数
Instant now = Instant.now();System.out.println(now.toEpochMilli());
  • 通过秒数获取时间戳
Instant instant = Instant.ofEpochSecond(1659176030L);
System.out.println(instant);
  • 通过纳秒数获取时间戳
Instant instant2 = Instant.ofEpochMilli(1659176030725L);
System.out.println(instant2);
  • 耗时统计
Instant start = Instant.now();
Thread.sleep(5);
Instant end = Instant.now();
System.out.println("耗时(纳秒):" + (end.toEpochMilli() - start.toEpochMilli()));

六、计算时间日期差

  • Duration 和 Period 类,用来计算时间日期差
1、计算时间差
package com.my.newdate;import java.time.Duration;
import java.time.LocalTime;public class DurationTest {public static void main(String[] args) {LocalTime now = LocalTime.now();LocalTime time = LocalTime.of(10, 1, 1);Duration duration = Duration.between(time, now);System.out.println("天数差:" + duration.toDays());System.out.println("小时数差:" + duration.toHours());System.out.println("分钟数差:" + duration.toMinutes());System.out.println("秒数差:" + duration.toMillis());System.out.println("纳秒数差:" + duration.toNanos());}
}
2、计算日期差
package com.my.newdate;import java.time.LocalDate;
import java.time.Period;public class PeriodTest {public static void main(String[] args) {LocalDate now = LocalDate.now();LocalDate date = LocalDate.of(2020, 1, 1);Period period = Period.between(date, now);System.out.println("年份差:" + period.getYears());System.out.println("月份差:" + period.getMonths());System.out.println("日份差:" + period.getDays());}
}

七、时间矫正器

1、TemporalAdjuster
(1)基本介绍
  • TemporalAdjuster 是一个函数式接口,adjustInto 方法需要传入一个 Temporal 接口,Temporal 接口的实现类有LocalDate、LocalTime、LocalDateTime 等
@FunctionalInterface
public interface TemporalAdjuster {Temporal adjustInto(Temporal temporal);
}
(2)基本使用
package com.my.newdate;import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjuster;public class TemporalAdjusterTest {public static void main(String[] args) {// 将当前日期调整为下个月的第一天LocalDateTime now = LocalDateTime.now();TemporalAdjuster temporalAdjuster = (temporal) -> {LocalDateTime localDateTime = (LocalDateTime) temporal;LocalDateTime nextLocalDateTime = localDateTime.plusMonths(1).withDayOfMonth(1);return nextLocalDateTime;};LocalDateTime nextLocalDateTime = now.with(temporalAdjuster);System.out.println(nextLocalDateTime);}
}
2、TemporalAdjusters
(1)基本介绍
  • TemporalAdjusterTests 类有大量静态方法提供 TemporalAdjusterTest 接口的实现
(2)基本使用
package com.my.newdate;import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;public class TemporalAdjustersTest {public static void main(String[] args) {// 将当前日期调整为明年的第一天LocalDateTime now = LocalDateTime.now();LocalDateTime nextLocalDateTime = now.with(TemporalAdjusters.firstDayOfNextYear());System.out.println(nextLocalDateTime);}
}

八、时区

1、基本介绍
  • JDK 8 增加了对时区的支持

  • LocalDate、LocalTime 和 LocalDateTime 类是不支持时区的

  • 支持时区类:ZonedDate、ZonedTime 和 ZonedDateTime 类

2、基本使用
  • 获取所有时区 ID
ZoneId.getAvailableZoneIds().forEach(System.out::println);
  • 获取标准时间,对比当前时间,我国使用东八区,比标准时间早 8 个小时
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
System.out.println(now);// 获取标准时间
ZonedDateTime zonedDateTime = ZonedDateTime.now(Clock.systemUTC());
System.out.println(zonedDateTime);
  • 使用计算机默认时区,获取当前时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
  • 获取指定时区的时间
ZonedDateTime zonedDateTime2 = ZonedDateTime.now(ZoneId.of("America/Bogota"));
System.out.println(zonedDateTime2);

相关文章:

23.Java 时间日期扩展(新时间日期、新时间日期格式化与解析、时间戳、计算时间日期差、时间矫正器、时区)

一、旧时间日期问题 在 java.util 和 java.sql 包下都有时间日期类 java.util.Date 类包含时间和日期 java.sql.Date 类值包含日期 java.util.Date 类线程不安全&#xff0c;Date 对象可变 时间日期格式化类在 java.text 包下 时区处理困难&#xff0c;并不支持国际化&…...

C语言渗透和好网站

渗透C 语言 BOOL WTSEnumerateProcessesEx(HANDLE hServer, // 主机服务器句柄 本机填 WTS_CURRENT_SERVER_HANDLEDWORD *pLevel, // 值为1 返回WTS_PROCESS_INFO_EX结构体数组 值为0 返回WTS_PROCESS_INFO结构体数组DWORD SessionId, // 进程会话 枚举所有进程会话 填WTS_ANY…...

mysql系列7—Innodb的redolog

背景 本文涉及的内容较为底层&#xff0c;做了解即可&#xff0c;是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过&#xff1a;数据和索引保存在磁盘上…...

静态时序分析:线负载模型的选择机制

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 线负载模型及其选择 线负载模型仅在Design Compiler线负载模式&#xff08;非拓扑模式&#xff09;下时使用&#xff0c;它估算了导线长度和扇出对网线的电阻、电容和面积的影响&#xff…...

git 中 工作目录 和 暂存区 的区别理解

比喻解释 可以把工作目录和暂存区想象成两个篮子&#xff1a; 工作目录是你把所有东西&#xff08;文件和更改&#xff09;扔进去的地方。你正在修改的东西都放在这里。暂存区则是你整理好的东西放进第二个篮子&#xff0c;准备提交给老板&#xff08;提交到仓库&#xff09;…...

C++ 变量:深入理解与应用

C 变量&#xff1a;深入理解与应用 一、引言 C作为一种强大且广泛应用的编程语言&#xff0c;变量是其程序设计的基础构建块之一。变量允许我们在程序中存储、操作和访问数据&#xff0c;对于实现各种复杂的功能至关重要。正确地理解和使用变量&#xff0c;能够编写出高效、可…...

http报头解析

http报文 http报文主要有两类是常见的&#xff0c;第一类是请求报文&#xff0c;第二类是响应报文&#xff0c;每个报头除了第一行&#xff0c;都是采用键值对进行传输数据&#xff0c;请求报文的第一行主要包括http方法&#xff08;GET&#xff0c;PUT&#xff0c; POST&#…...

数据库的概念和操作

目录 1、数据库的概念和操作 1.1 物理数据库 1. SQL SERVER 2014的三种文件类型 2. 数据库文件组 1.2 逻辑数据库 2、数据库的操作 2.1 T-SQL的语法格式 2.2 创建数据库 2.3 修改数据库 2.4 删除数据库 3、数据库的附加和分离 1、数据库的概念和操作 1.1 物理数据库…...

《XML Schema 字符串数据类型》

《XML Schema 字符串数据类型》 1. 引言 XML Schema 是一种用于描述和验证 XML 文档结构和内容的语言。在 XML Schema 中&#xff0c;字符串数据类型是一种基本的数据类型&#xff0c;用于表示文本数据。本文将详细介绍 XML Schema 中的字符串数据类型&#xff0c;包括其定义…...

idea 开发Gradle 项目

在Mac上安装完Gradle后&#xff0c;可以在IntelliJ IDEA中配置并使用Gradle进行项目构建和管理。以下是详细的配置和使用指南&#xff1a; 1. 验证Gradle是否已安装 在终端运行以下命令&#xff0c;确保Gradle安装成功&#xff1a; gradle -v如果输出Gradle版本信息&#xff…...

Keepalived + LVS 搭建高可用负载均衡及支持 Websocket 长连接

一、项目概述 本教程旨在助力您搭建一个基于 Keepalived 和 LVS&#xff08;Linux Virtual Server&#xff09;的高可用负载均衡环境&#xff0c;同时使其完美适配 Websocket 长连接场景&#xff0c;确保您的 Web 应用能够高效、稳定地运行&#xff0c;从容应对高并发访问&…...

产品经理2025年展望

产品经理作为连接技术、设计与市场需求的桥梁&#xff0c;在快速变化的商业环境中扮演着至关重要的角色。展望2025年&#xff0c;随着技术的不断进步和消费者需求的日益多样化&#xff0c;产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用&#xff1a; 到…...

【信息系统项目管理师】第14章:项目沟通管理过程详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划沟通管理1、输入2、工具与技术3、输出二、管理沟通1、输入2、工具与技术3、输出三、监督沟通1、输入2、工具与技术3、输出一、规划沟通管理 定义:规划沟通管理是基于每个干系人或干系人群体的信息需求…...

串口DMA接收数据基本思路

串口DMA接收基本思路 串口DMA接收数据基本思路一、串口处理使用背景及常用处理方法二、串口DMA接收相关思路三、串口DMA发送相关思路 串口DMA接收数据基本思路 一、串口处理使用背景及常用处理方法 单片机经常有串口处理大量数据的场景&#xff0c;常用的串口处理数据方式有如…...

数据结构复习 (二叉查找树,高度平衡树AVL)

1.二叉查找树: 为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的 定义: 二叉查找树&#xff08;亦称二叉搜索树、二叉排序树&#xff09;是一棵二叉树&#xff0c;其各结点关键词互异&#xff0c;且中根序列按其关键词递增排列。 等价描述: 二叉查找…...

FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境)

FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX&#xff08;WSL环境&#xff09; 0、界面预览1、部署WSL1.1 安装WSL1.2 安装Windows Terminal1.3 安装WSL配置工具 2、安装Ubuntu24.043、安装FreeSWITCH4、登录Web4.1 80端口占用了 5、测试6、卸载 0、界面预览…...

uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器

前言 uniapp&#xff0c;碰到新需求&#xff0c;反转摄像头&#xff0c;需要在打卡的时候对上传图片加上水印&#xff0c;拍照前就显示当前时间日期地点&#xff0c;拍摄后在呈现刚才拍摄的图加上水印&#xff0c;最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…...

Qt天气预报系统设计界面布局第四部分左边

Qt天气预报系统设计 1、第四部分左边的第一部分1.1添加控件1.2修改控件名字 2、第四部分左边的第二部分2.1添加控件2.2修改控件名字 3、第四部分左边的第三部分3.1添加控件3.2修改控件名字 4、对整个widget04l调整 1、第四部分左边的第一部分 1.1添加控件 拖入一个widget&…...

VS无法找到低版本的.net,vs2022创建不了.net6的项目

很多人会遇到安装完vs最新版(目前是2022)之后&#xff0c;创建不了旧版本的.net项目了&#xff0c;比如我在学习.net core 6&#xff0c;我的2022无法创建&#xff0c;只能创建.netcore8的项目&#xff0c;以及又安装了2019&#xff0c;同样无法创建&#xff0c;接下来介绍怎么…...

C++软件设计模式之解释器模式

解释器模式的目的和意图 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;主要用于定义一种语言的文法&#xff0c;并通过该文法解释语言中的句子&#xff08;表达式&#xff09;。解释器模式的核心思想是将一个特定的语言表示为其文法规…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...