🔥「炎码工坊」技术弹药已装填!
点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】

 

场景问题:订单处理系统的时间计算

假设你正在开发一个电商订单系统,需要解决以下问题: 

  • 用户下单后,需在 2小时内 完成支付,超时自动取消订单。 
  • 订单完成后,需计算 从下单到完成的总耗时(精确到分钟)。 
  • 系统需支持 全球用户,显示时间需根据用户所在时区调整。

这些问题的核心在于:如何准确地表示、计算、格式化时间? 


方案对比:新旧API的“生死对决”

方案一:传统 Date + SimpleDateFormat(Java 7及以下)

// 示例:计算订单超时时间(Java 7)  
Date now = new Date();  
Date expireTime = new Date(now.getTime() + 2 * 60 * 60 * 1000); // 手动加2小时毫秒值  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
String formattedNow = sdf.format(now); // 格式化时间  // 问题:线程安全风险!  
SimpleDateFormat sdfShared = new SimpleDateFormat("yyyy-MM-dd");  
// 多线程环境下并发调用 sdfShared.parse() 会导致数据混乱  

缺点: 

  1. 线程不安全SimpleDateFormat 是可变对象,多线程共享时需额外加锁。 
  2. 易用性差:日期加减需手动计算毫秒值(如 2 * 60 * 60 * 1000)。 
  3. 时区处理复杂:需显式传递 TimeZone 对象,代码冗余。

方案二:现代 java.time API(Java 8+)

// 示例:订单超时时间计算(Java 8+)  
LocalDateTime now = LocalDateTime.now();  
LocalDateTime expireTime = now.plusHours(2); // 直接加2小时  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
String formattedNow = now.format(formatter); // 线程安全  // 计算耗时(如订单完成时间 - 下单时间)  
LocalDateTime orderTime = LocalDateTime.of(2025, 6, 17, 10, 0);  
LocalDateTime completeTime = LocalDateTime.of(2025, 6, 17, 12, 30);  
long minutes = Duration.between(orderTime, completeTime).toMinutes(); // 150分钟  // 时区支持:上海用户看到的时间  
ZonedDateTime shanghaiTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));  

优点: 

  1. 线程安全:所有类均为不可变对象(如 DateTimeFormatter 可全局复用)。 
  2. 语义明确:直接调用 plusHours(2),无需手动计算毫秒。 
  3. 时区一体化ZonedDateTime 内置时区支持。

可视化流程:时间处理的“三步走”

 

核心类速查表(Java 8+)

类名全称/用途说明典型场景
LocalDate仅表示日期(年-月-日)生日、节假日
LocalTime仅表示时间(时:分:秒)每日定时任务
LocalDateTime日期+时间(无时区)数据库存储、本地时间计算
ZonedDateTime带时区的完整时间国际化时间展示
Duration时间段(精确到秒或纳秒)计算两个时间点的差值
Period日期段(精确到年、月、日)计算两个日期相差的年/月/日
DateTimeFormatter线程安全的日期格式化工具时间与字符串的互相转换

实战代码:常见操作模板

// 1. 获取当前时间  
LocalDateTime now = LocalDateTime.now();  // 2. 格式化输出(如 "2025-06-17 15:30:00")  
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");  
String formatted = now.format(formatter);  // 3. 解析字符串为时间  
String input = "2025-06-17 15:30:00";  
LocalDateTime parsed = LocalDateTime.parse(input, formatter);  // 4. 日期计算(加减)  
LocalDate today = LocalDate.now();  
LocalDate tomorrow = today.plusDays(1);  
LocalDate nextMonth = today.plusMonths(1);  // 5. 时区转换  
ZonedDateTime utcTime = ZonedDateTime.now(ZoneId.of("UTC"));  
ZonedDateTime nyTime = utcTime.withZoneSameInstant(ZoneId.of("America/New_York"));  

最佳实践总结

  1. 优先使用 java.time:避免旧版API的线程安全问题和复杂计算逻辑。 
  2. 复用 DateTimeFormatter:因其线程安全,建议定义为静态常量。 
  3. 时区处理用 ZonedDateTime:避免手动调整时差,直接依赖时区ID(如 "Asia/Shanghai")。 
  4. 避免在循环中创建对象:如 LocalDateTime.now() 频繁调用可能影响性能。

术语表

术语解释
时间戳(Timestamp)自1970-01-01 00:00:00 UTC到现在的毫秒数,用于计算机内部时间表示。
时区(Time Zone)表示地球某一区域的本地时间,如 Asia/Shanghai代表中国标准时间(UTC+8)。
不可变对象(Immutable)创建后状态不可修改的对象,天然线程安全,如 LocalDate
线程安全(Thread-safe)多线程环境下无需额外同步即可安全使用的代码。

从“踩坑”到“填坑”:Java 8 的 java.timeAPI 通过清晰的设计和强大的功能,彻底解决了旧版时间类的痛点。无论是计算、格式化还是国际化,新API都能以更简洁的方式完成任务。对于新项目,永远不要再使用 Date 和 SimpleDateFormat

 


🚧 您已阅读完全文99%!缺少1%的关键操作:
加入「炎码燃料仓」🚀 获得:
√ 开源工具红黑榜
√ 项目落地避坑指南
√ 每周BUG修复进度+1%彩蛋
(温馨提示:本工坊不打灰工,只烧脑洞🔥) 

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的Excel列数据提取工具实现

摘要:本文介绍了一个使用Java语言开发的Excel列数据提取工具,该工具借助Apache POI库实现对Excel文件的读取与特定列数据提取功能。通过用户输入文件路径与列名,程序可从指定Excel文件中提取相应列的数据并展示,同时详细阐述了关键…

关于人工智能未来的趋势

学而不思则罔 翻译:使用深度学习、强化学习却不用专家系统,就会产生幻觉。 思而不学则殆 翻译:只有专家系统逻辑推理,但是不用大模型更新知识,就无法发展下去了。 因此,未来智能的范式应该是: …

Java八股文——MySQL「性能调优篇」

MySQL的EXPLAIN有什么作用? 面试官您好,EXPLAIN命令是我在进行SQL性能优化时,使用最频繁、也最重要的一个工具。 它的核心作用可以一句话概括:模拟MySQL的查询优化器来执行一条SQL语句,并向我们展示出它最终决定采用…

win打印机共享处理

win打印机共享处理 软件链接 无法启动Print Spooler服务错误193:0xc1的解决方案主要涉及修复服务依赖关系、清理打印缓存及修复系统文件‌。该错误通常由系统文件损坏、注册表配置异常或依赖服务未启动导致,可通过以下步骤系统化解决。‌‌ 解决方法:替换…

C++ map代码练习 1、2、priority_queue基础概念、对象创建、数据插入、获取堆顶、出队操作、大小操作,自定义结构、代码练习 1 2

map代码练习1&#xff0c;对应力扣 两个数据的交集&#xff0c;代码见下 class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {map<int, int> cnt;vector<int> ans;for(int i0; i<nums1.size(…

三天冲刺《编译原理》——笔记(一)

点关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 持续关注我~~~主页&#xff0c;查看更多内容哟&#xff08;希望你能在这里有所收获&#x1f92d;&#xff09;。点关注&#xff0c;不迷路&#xf…

代理模式Proxy Pattern

模式定义 给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用 对象结构型模式 模式结构 Subject&#xff1a;抽象主题角色Proxy&#xff1a;代理主题角色RealSubject&#xff1a;真实主题角色 代理类实现代码 public class Proxy implements Subject {p…

基于YOLOv11与单目测距的实战教程:从目标检测到距离估算

引言 在计算机视觉领域&#xff0c;目标检测与距离估算的结合是自动驾驶、机器人导航等场景的关键技术。本文将以YOLOv8模型为核心&#xff0c;结合单目相机的几何模型&#xff0c;实现对视频中目标的实时检测与距离估算。代码参考自单目测距原理博客&#xff0c;并通过实践验…

代码生成器使用原理以及使用方法

代码生成器使用原理以及使用方法 版本号&#xff1a;1.0 二Ο二五年二月 目录 文档介绍 1.1编写目的 1.2文档范围 1.3读者对象 系统设计 2.1设计目标 2.2设计思路 2.3代码实现原理 使用方法 3.1如何使用 3.2如何修改&#xff1f; 对原程序的bug修改及简…

STM32标准库-I2C通信

文章目录 一、I2C通信1.1 I2C1.2硬件电路1.3I2C时序基本单元1.4I2C时序 二、MPU60502.1简介2.2MPU6050参数2.3硬件电路2.4MPU6050框图 三、I2C外设(硬件)3.1简介3.2I2C框图3.3I2C基本结构3.4主机发送3.5主机接收3.6软件/硬件波形对比1. 时序精度2. 信号稳定性3. 速率与效率4. 波…

使用 Azure LLM Functions 与 Elasticsearch 构建更智能的查询体验

作者&#xff1a;来自 Elastic Jonathan Simon 及 James Williams 试用这个示例房地产搜索应用&#xff0c;它结合了 Azure Gen AI LLM Functions 与 Elasticsearch&#xff0c;提供灵活的混合搜索结果。在 GitHub Codespaces 中查看逐步配置和运行该示例应用的方法。 更多阅读…

模糊查询 的深度技术解析

以下是 模糊查询 的深度技术解析&#xff0c;涵盖核心语法、通配符策略、性能优化及实战陷阱&#xff1a; &#x1f50d; 一、核心运算符&#xff1a;LIKE SELECT * FROM 表名 WHERE 列名 LIKE 模式字符串;&#x1f3af; 二、通配符详解 通配符作用示例匹配案例%任意长度字符…

[论文阅读] (39)EuroSP25 CTINEXUS:基于大模型的威胁情报知识图谱自动构建

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

强化学习三大分类

核心目标&#xff1a; 教会一个智能体&#xff08;比如机器人、游戏AI、推荐系统&#xff09;通过试错和奖励&#xff0c;学会在某个环境中完成特定任务的最佳策略。 核心角色&#xff1a; 智能体 (Agent)&#xff1a; 学习者&#xff0c;比如玩游戏的小人、控制温度的空调系…

城市排水生命线安全运行监测项目

近年来&#xff0c;城市内涝、污水溢流等问题频发&#xff0c;让排水管网这一"城市生命线"的安全运行备受关注。如何让地下的"毛细血管"更智能、更可靠&#xff1f;本文将带您深入解析城市排水生命线安全运行监测项目的建设逻辑与技术内核&#xff0c;看科…

LeetCode - 34. 在排序数组中查找元素的第一个和最后一个位置

题目 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 思路 查找左边界 初始化 left 0, right nums.size() - 1 当 left < right 时循环&#xff1a; 计算中点 mid left (right - left) / 2 如果 nums[mid] < target…

Tesollo四指灵巧手DG-4F:18自由度与多种抓取模式结合实现高精度操作

Tesollo四指灵巧手 DG-4F 是一款具备 18 自由度的多模态末端执行器&#xff0c;采用模块化结构设计&#xff0c;融合人手灵活性与夹爪高效性特点。该产品兼容 Universal Robots、Techman、Doosan Robotics、Rainbow Robotics 等主流机器人平台&#xff0c;适用于工业自动化、科…

深入浅出JavaScript 原型链:对象继承的“隐形链条”

深入浅出JavaScript 原型链&#xff1a;对象继承的“隐形链条” 在 JavaScript 的世界里&#xff0c;原型链&#xff08;Prototype Chain&#xff09;是一个核心概念。它如同一条隐形的链条&#xff0c;连接着所有对象&#xff0c;使得代码能够高效地共享属性和方法。理解原型…

LINUX中MYSQL的使用

LINUX中MYSQL的使用 MYSQL的数据类型 bool&#xff1a; 布尔类型 0 或者 1 CHAR&#xff1a; 单字符的字符 CHAR&#xff08;n&#xff09;:多字节字符 VARCHAR&#xff08;n&#xff09;&#xff1a;可变长度的字符型 TINYINT &#xff1a; 单字节整型 SMALLINT&#x…

打卡第48天:随机函数与广播机制

知识点回顾&#xff1a; 随机张量的生成&#xff1a;torch.randn函数卷积和池化的计算公式&#xff08;可以不掌握&#xff0c;会自动计算的&#xff09;pytorch的广播机制&#xff1a;加法和乘法的广播机制 ps&#xff1a;numpy运算也有类似的广播机制&#xff0c;基本一致 …