23.Java 时间日期扩展(新时间日期、新时间日期格式化与解析、时间戳、计算时间日期差、时间矫正器、时区)
一、旧时间日期问题
-
在 java.util 和 java.sql 包下都有时间日期类
-
java.util.Date 类包含时间和日期
-
java.sql.Date 类值包含日期
-
-
java.util.Date 类线程不安全,Date 对象可变
-
时间日期格式化类在 java.text 包下
-
时区处理困难,并不支持国际化,没有时区支持
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 类线程不安全,Date 对象可变 时间日期格式化类在 java.text 包下 时区处理困难,并不支持国际化&…...
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
背景 本文涉及的内容较为底层,做了解即可,是以前学习《高性能Mysql》和《mysql是怎样运行的》的笔记整理所得。 redolog(后续使用redo日志表示)的核心作用是保证数据库的持久性。 在mysql系列5—Innodb的缓存中介绍过:数据和索引保存在磁盘上…...
静态时序分析:线负载模型的选择机制
相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 线负载模型及其选择 线负载模型仅在Design Compiler线负载模式(非拓扑模式)下时使用,它估算了导线长度和扇出对网线的电阻、电容和面积的影响ÿ…...
git 中 工作目录 和 暂存区 的区别理解
比喻解释 可以把工作目录和暂存区想象成两个篮子: 工作目录是你把所有东西(文件和更改)扔进去的地方。你正在修改的东西都放在这里。暂存区则是你整理好的东西放进第二个篮子,准备提交给老板(提交到仓库)…...
C++ 变量:深入理解与应用
C 变量:深入理解与应用 一、引言 C作为一种强大且广泛应用的编程语言,变量是其程序设计的基础构建块之一。变量允许我们在程序中存储、操作和访问数据,对于实现各种复杂的功能至关重要。正确地理解和使用变量,能够编写出高效、可…...
http报头解析
http报文 http报文主要有两类是常见的,第一类是请求报文,第二类是响应报文,每个报头除了第一行,都是采用键值对进行传输数据,请求报文的第一行主要包括http方法(GET,PUT, 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 中,字符串数据类型是一种基本的数据类型,用于表示文本数据。本文将详细介绍 XML Schema 中的字符串数据类型,包括其定义…...
idea 开发Gradle 项目
在Mac上安装完Gradle后,可以在IntelliJ IDEA中配置并使用Gradle进行项目构建和管理。以下是详细的配置和使用指南: 1. 验证Gradle是否已安装 在终端运行以下命令,确保Gradle安装成功: gradle -v如果输出Gradle版本信息ÿ…...
Keepalived + LVS 搭建高可用负载均衡及支持 Websocket 长连接
一、项目概述 本教程旨在助力您搭建一个基于 Keepalived 和 LVS(Linux Virtual Server)的高可用负载均衡环境,同时使其完美适配 Websocket 长连接场景,确保您的 Web 应用能够高效、稳定地运行,从容应对高并发访问&…...
产品经理2025年展望
产品经理作为连接技术、设计与市场需求的桥梁,在快速变化的商业环境中扮演着至关重要的角色。展望2025年,随着技术的不断进步和消费者需求的日益多样化,产品经理的工作将面临更多挑战与机遇。 一、人工智能与自动化深化应用: 到…...
【信息系统项目管理师】第14章:项目沟通管理过程详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划沟通管理1、输入2、工具与技术3、输出二、管理沟通1、输入2、工具与技术3、输出三、监督沟通1、输入2、工具与技术3、输出一、规划沟通管理 定义:规划沟通管理是基于每个干系人或干系人群体的信息需求…...
串口DMA接收数据基本思路
串口DMA接收基本思路 串口DMA接收数据基本思路一、串口处理使用背景及常用处理方法二、串口DMA接收相关思路三、串口DMA发送相关思路 串口DMA接收数据基本思路 一、串口处理使用背景及常用处理方法 单片机经常有串口处理大量数据的场景,常用的串口处理数据方式有如…...
数据结构复习 (二叉查找树,高度平衡树AVL)
1.二叉查找树: 为了更好的实现动态的查找(可以插入/删除),并且不超过logn的时间下达成目的 定义: 二叉查找树(亦称二叉搜索树、二叉排序树)是一棵二叉树,其各结点关键词互异,且中根序列按其关键词递增排列。 等价描述: 二叉查找…...
FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境)
FreeSWITCH 简单图形化界面39 - Windows安装FreeSWITCH For IPPBX(WSL环境) 0、界面预览1、部署WSL1.1 安装WSL1.2 安装Windows Terminal1.3 安装WSL配置工具 2、安装Ubuntu24.043、安装FreeSWITCH4、登录Web4.1 80端口占用了 5、测试6、卸载 0、界面预览…...
uniapp - 小程序实现摄像头拍照 + 水印绘制 + 反转摄像头 + 拍之前显示时间+地点 + 图片上传到阿里云服务器
前言 uniapp,碰到新需求,反转摄像头,需要在打卡的时候对上传图片加上水印,拍照前就显示当前时间日期地点,拍摄后在呈现刚才拍摄的图加上水印,最好还需要将图片上传到阿里云。 声明 水印部分代码是借鉴的…...
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)之后,创建不了旧版本的.net项目了,比如我在学习.net core 6,我的2022无法创建,只能创建.netcore8的项目,以及又安装了2019,同样无法创建,接下来介绍怎么…...
C++软件设计模式之解释器模式
解释器模式的目的和意图 解释器模式(Interpreter Pattern)是一种行为设计模式,主要用于定义一种语言的文法,并通过该文法解释语言中的句子(表达式)。解释器模式的核心思想是将一个特定的语言表示为其文法规…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
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在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
