Java 8常用时间 API
Date: 你不爱我了吗? 🚡
- 本地时间
- 时区相关
- 格式化
在Java 8中,Instant类用于表示时间戳,相当于旧的Date类;LocalDateTime类用于表示日期和时间,相当于旧的Calendar类;DateTimeFormatter类用于格式化日期和时间,相当于旧的SimpleDateFormat类
本地时间
- LocalDate:表示日期,如:2023-04-06。
LocalDate now = LocalDate.now(); // 获取当前日期
LocalDate date = LocalDate.of(2023, 4, 6); // 通过年、月、日创建LocalDate对象
LocalDate plusDate = date.plusDays(1); // 增加1天
LocalDate minusDate = date.minusDays(1); // 减少1天
int year = date.getYear(); // 获取年份
int month = date.getMonthValue(); // 获取月份
int day = date.getDayOfMonth(); // 获取日期
- LocalTime:表示时间,如:14:30:00。
LocalTime now = LocalTime.now(); // 获取当前时间
LocalTime time = LocalTime.of(14, 30); // 通过小时和分钟创建LocalTime对象
LocalTime plusTime = time.plusHours(1); // 增加1小时
LocalTime minusTime = time.minusMinutes(30); // 减少30分钟
int hour = time.getHour(); // 获取小时
int minute = time.getMinute(); // 获取分钟
- LocalDateTime:表示日期时间,如:2023-04-06T14:30:00。
LocalDateTime now = LocalDateTime.now(); // 获取当前日期时间
LocalDateTime dateTime = LocalDateTime.of(2023, 4, 6, 14, 30); // 通过年、月、日、小时和分钟创建LocalDateTime对象
LocalDateTime plusDateTime = dateTime.plusDays(1); // 增加1天
LocalDateTime minusDateTime = dateTime.minusHours(2); // 减少2小时
int year = dateTime.getYear(); // 获取年份
int month = dateTime.getMonthValue(); // 获取月份
int day = dateTime.getDayOfMonth(); // 获取日期
int hour = dateTime.getHour(); // 获取小时
int minute = dateTime.getMinute(); // 获取分钟
- Instant:表示时间戳,即从1970年1月1日00:00:00开始的毫秒数。
Instant now = Instant.now(); // 获取当前时间戳
Instant instant = Instant.ofEpochMilli(1000); // 通过时间戳创建Instant对象
Instant plusInstant = instant.plusSeconds(10); // 增加10秒
Instant minusInstant = instant.minusMillis(500); // 减少500毫秒
long epochMilli = instant.toEpochMilli(); // 获取从1970年1月1日00:00:00开始的毫秒数
- Duration:表示时间间隔,如:2小时30分钟。
LocalDateTime start = LocalDateTime.of(2023, 4, 6, 14, 30);
LocalDateTime end = LocalDateTime.of(2023, 4, 6, 16, 0);
Duration duration = Duration.between(start, end); // 计算两个时间点之间的时间间隔
Duration plusDuration = duration.plusHours(1); // 增加1小时
Duration minusDuration = duration.minusMinutes(30); // 减少30分钟
long hours = duration.toHours(); // 获取总小时数
long minutes = duration.toMinutes(); // 获取总分钟数
- Period:表示日期间隔,如:2天。
LocalDate start = LocalDate.of(2023, 4, 6);
LocalDate end = LocalDate.of(2023, 4, 8);
Period period = Period.between(start, end); // 计算两个日期之间的日期间隔
Period plusPeriod = period.plusDays(1); // 增加1天
Period minusPeriod = period.minusWeeks(1); // 减少1周
int days = period.getDays(); // 获取天数
int months = period.getMonths(); // 获取月数
这些类都是线程安全的,不可变的,因此适合在多线程环境下使用。
在Java中,这些时间类的作用非常广泛,它们可以帮助我们处理日期时间相关的逻辑,例如计算时间差、格式化日期时间、比较时间、转换时区等等。在实际开发中,我们常常需要进行时间计算,例如计算两个时间点之间的时间差、计算某个日期是周几等等。这些时间类可以大大简化这些操作,使得我们的代码更加简洁、清晰、易于维护。
时区相关
- ZoneId:时区标识符,表示不同的时区,例如“Asia/Shanghai”。
ZoneId systemZone = ZoneId.systemDefault(); // 获取系统默认时区
ZoneId beijingZone = ZoneId.of("Asia/Shanghai"); // 根据时区ID创建ZoneId对象
- ZonedDateTime:带时区的日期时间,可以表示不同时区下的日期时间,例如“2023-04-06T14:30:00+08:00[Asia/Shanghai]”。
ZonedDateTime now = ZonedDateTime.now(); // 获取当前日期时间和时区信息的ZonedDateTime对象
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDateTime.of(2023, 4, 6, 14, 30), ZoneId.of("Asia/Shanghai")); // 根据本地日期时间和时区创建ZonedDateTime对象
ZonedDateTime withZone = zonedDateTime.withZoneSameInstant(ZoneId.of("America/New_York")); // 修改时区,并且保持日期时间不变
int year = zonedDateTime.getYear(); // 获取年份
int month = zonedDateTime.getMonthValue(); // 获取月份
int day = zonedDateTime.getDayOfMonth(); // 获取日期
int hour = zonedDateTime.getHour(); // 获取小时
int minute = zonedDateTime.getMinute(); // 获取分钟
ZoneId zone = zonedDateTime.getZone(); // 获取时区信息
- OffsetDateTime:带时区偏移量的日期时间,可以表示相对于UTC的偏移量,例如“2023-04-06T14:30:00+08:00”。
OffsetDateTime now = OffsetDateTime.now(); // 获取当前日期时间和时区偏移量信息的OffsetDateTime对象
OffsetDateTime offsetDateTime = OffsetDateTime.of(LocalDateTime.of(2023, 4, 6, 14, 30), ZoneOffset.of("+08:00")); // 根据本地日期时间和时区偏移量创建OffsetDateTime对象
OffsetDateTime plusOffsetDateTime = offsetDateTime.plusHours(1); // 增加1小时
OffsetDateTime minusOffsetDateTime = offsetDateTime.minusMinutes(30); // 减少30分钟
int year = offsetDateTime.getYear(); // 获取年份
int month = offsetDateTime.getMonthValue(); // 获取月份
int day = offsetDateTime.getDayOfMonth(); // 获取日期
int hour = offsetDateTime.getHour(); // 获取小时
int minute = offsetDateTime.getMinute(); // 获取分钟
ZoneOffset offset = offsetDateTime.getOffset(); // 获取时区偏移量信息
- ZoneOffset:时区偏移量,表示相对于UTC的偏移量,例如“+08:00”。
ZoneOffset offset1 = Zone
这些与时区相关的时间类可以帮助我们处理跨时区的时间计算和表示。在处理全球化应用时,时区相关的操作尤其重要,因为不同地区的时间可能有巨大的差异。这些时间类提供了强大的功能来处理跨时区的时间计算和表示,使得我们可以更好地应对全球化应用的时间需求。
格式化
在JDK8中,如果要对时间进行格式化,可以使用以下几个类:
-
DateTimeFormatter:日期时间格式化类,它提供了很多方法来将日期时间格式化为字符串或解析字符串为日期时间。
-
SimpleDateFormat:日期时间格式化类,它是JDK早期版本中的日期时间格式化类,在JDK8中仍然保留。它使用一些预定义的格式化字符串来格式化日期时间。
这两个类都提供了格式化日期时间的功能,但是使用方式略有不同。DateTimeFormatter提供了更加灵活的API来定制日期时间格式,它支持解析和格式化ISO 8601格式的日期时间字符串,并且可以支持多种语言环境。SimpleDateFormat则更适合于一些简单的日期时间格式化场景,它使用的是预定义的格式化字符串,虽然使用起来比较简单,但是可定制性较差。
下面是一个使用DateTimeFormatter对日期时间进行格式化的示例代码:
LocalDateTime dateTime = LocalDateTime.of(2023, 4, 6, 14, 30);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter); // 将日期时间格式化为指定格式的字符串
LocalDateTime parsedDateTime = LocalDateTime.parse("2023-04-06 14:30:00", formatter); // 将指定格式的字符串解析为日期时间
上面的代码使用DateTimeFormatter将当前时间格式化为“yyyy-MM-dd HH:mm:ss”的字符串格式。
相关文章:
Java 8常用时间 API
Date: 你不爱我了吗? 🚡本地时间时区相关格式化在Java 8中,Instant类用于表示时间戳,相当于旧的Date类;LocalDateTime类用于表示日期和时间,相当于旧的Calendar类;DateTimeFormatter类用于格式化日期和时间…...
C++运算符
C运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 1. 算术运算符 运算符描述实例把两个操作数相加A B 将得到 30-从第…...

低/无代码赋能企业,IT与业务的角色正在悄然改变
现在这个社会,年轻人的压力是真的大,需要会的技能多到数不清。想学习多点技能也不知道去哪学,主要是网络资源太丰富,很难找到一个适合自己的。那接下来推荐4个大神级别的资源网站你可一定得码住,都是年轻人特别 …...

SpringCloud学习2(Spring Cloud Netflix)负载均衡Ribbon、Feign负载均衡、Hystix服务熔断
文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类,并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介F…...

Spring 源码解析 - @Async 注解下的循环依赖问题原理
一、Async 注解下的循环依赖问题 我们都知道 Spring IOC 单例模式下可以帮助我们解决循环依赖问题,比如下面自己依赖自己循环依赖的场景: Component public class TestAsync {ResourceTestAsync async;public void test() {System.out.println("t…...

8个全球性编程比赛,天才程序员的梦想舞台
很多编程爱好者在学习之初,都渴望与全球的程序员一较高下,以证明自己的实力。 一些全球性的编程竞赛为他们提供了这样的机会,不仅可以与全世界的顶尖程序员们交流,还有机会获得丰厚的奖金和进入顶级公司的机会,更重要…...

2023年中国海洋大学计算机及电子信息考研分析
考研时间跨度: 初试时间: 2022年8月23 海大推免及创新人才计划接收通知。 2022年9月13 海大专业目录及人数,包含推免。 2022年10月18 2022年硕士研究生计划 ,不含推免。 海大2022年硕士研究生计划 网上第一次时间为2022年9月24日…...

【C++笔试强训】第六天
选择题 1. 解析:十进制转换为八进制就是不断的除8,取余数。十进制转换成其他进制的数就是除以进制,取余。 解析:注意printf的转换,%%只会打印一个%,所以选A。 解析:由于()的原因p先和*结合&…...
Redission 中的 RedLock 原理实现, springboot 你造吗?
分布锁之RedLock 锁住你的心我的爱 🚂为什么需要使用 RedLock锁被误释放时钟不一致问题锁的“延迟释放”而不是死锁Redlock是啥redlock 存在什么问题惊群效应时钟漂移Redisson 实现 RedLock在 Redisson 中, RedLock的实现类是哪一个类?这一招叫抛砖引玉springboot …...

【沐风老师】3dMax一键房屋创建者插件使用方法详解
3dmax一键房屋创建者,一键生成墙体、窗洞和门洞的插件!这个脚本主要用于创建或捕获一些架构项目所代表的平面,这是通过导入它们并在每个所需的层添加值来实现的。传统方法,但是省事儿多了! 【版本要求】 3dMax 2015及…...
C/C++ 变量详解
文章目录前言一、静态变量与动态变量1. 概念2. 区别3. 使用方法和注意事项3.1 静态变量3.2 动态变量4. 结论二、全局变量与局部变量1. 区别2. 全局变量的使用方法和注意事项3. 局部变量的使用方法和注意事项4. 总结前言 对C学习感兴趣的可以看看这篇文章哦:C/C教程…...
新SSD盘安装操作系统启动不了
今天打算给电脑升级下装备,加装一块固态硬盘。 电脑原本自带两块硬盘(SSD128GSATA1T),SSD清理了许久还是没空间,于是就买了块1TSSD,打算扩容下。 打开电脑后盖傻眼了,没有备用插槽,…...
基于Spring、SpringMVC、MyBatis的病历管理系统
文章目录 项目介绍主要功能截图:登录首页医院公告管理用户管理科室信息管理医生管理出诊信息管理预约时间段管理预约挂号管理门诊病历管理就诊评价管理轮播图管理功能架构图部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历…...
QT编程从入门到精通之三十四:“第五章:Qt GUI应用程序设计”之“5.5 Qt Creator使用技巧”
目录 第五章:Qt GUI应用程序设计 5.5 Qt Creator使用技巧 第五章:Qt GUI应用程序设计 在“Qt 程序创建基础”上,本章将继续深入地介绍Qt Creator设计GUI应用程序的方法,包括Qt创建的应用程序项目的基本组织结构,可视化设计的UI界面文件的原理和运行机制,信号与槽的使用…...

网络工程方向有哪些SCI期刊推荐? - 易智编译EaseEditing
以下是网络工程领域的一些SCI期刊推荐: IEEE Transactions on Network and Service Management: 这是一个IEEE旗下的期刊,涵盖了网络与服务管理方面的研究。主要关注网络管理、服务管理和其它相关领域的创新和最新研究。 Computer Networks: 这是一本著…...

netty入门(二十六)任务加入异步线程池源码剖析
1.handler中加入线程池和Context添加线程池 1.1 源码剖析目的 (1)在 Netty 中做耗时的,不可预料的操作,比如:数据库、网络请求、会严重影响 Netty 对 Socket 的处理速度。 (2)而解决方法就是…...

神经网络算法入门和代码
文章内容 感知机(Perceptron)反向传播算法(Back Propagation algorithm)RBF(Radial Basis Function,径向基函数) 网络:单一层前馈网络,它使用径向基作为隐层神经元激活函数ART(Adaptive Resona…...

如何用一个端口同时暴露 HTTP1/2、gRPC、Dubbo 协议?
作者:华钟明 本文我们将介绍 Apache Dubbo 灵活的多协议设计原则,基于这一设计,在 Dubbo 框架底层可灵活的选用 HTTP/2、HTTP/REST、TCP、gRPC、JsonRPC、Hessian2 等任一 RPC 通信协议,同时享用统一的 API 与对等的服务治理能力。…...

ToBeWritten之杂项2
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...

Linux三剑客之awk命令详解
1、概述 Linux三剑客:grep、sed、awk。grep主打查找功能,sed主要是编辑行,awk主要是分割列处理。本篇文章我们详细介绍awk命令。 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。awk是一种编…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...