个人主页-爱因斯晨

友友们,互三咯~

目录

个人主页-爱因斯晨

​编辑

前言

一、JDK7 时间处理基石 ——Date 类

(一)Date 类基本功能

(二)Date 类的局限性

二、格式化时间好帮手 ——SimpleDateFormat 类

(一)格式化与解析原理

(二)常用模式符号

(三)格式化操作示例

(四)解析操作示例

三、更灵活的时间操作工具 ——Calendar 类

(一)Calendar 类特点

(二)获取 Calendar 实例

(三)常用方法及示例

(四)与 Date 类相互转换

四、JDK8 时间类 —— 新时代的时间处理方案

(一)LocalDate、LocalTime、LocalDateTime

(二)ZoneId 与 ZonedDateTime—— 时区处理

(三)DateTimeFormatter—— 线程安全的格式化工具

五、JDK7 与 JDK8 时间类对比与选择

(一)对比

(二)选择建议

六、总结


 

前言

在 Java 开发领域,时间处理是一项极为常见且关键的需求。无论是记录用户的操作时间,还是实现定时任务等功能,都离不开对时间 API 的灵活运用。本文围绕 JDK7 与 JDK8 中的时间处理类,结合学习内容,详细梳理Date、SimpleDateFormat、Calendar以及 JDK8 全新时间类的使用与演进,助力开发者掌握 Java 时间处理的核心要点。

一、JDK7 时间处理基石 ——Date 类

(一)Date 类基本功能

Date类位于java.util包下,是 JDK7 中用于表示特定瞬间的时间类,其精度可达到毫秒级别。它的出现,为 Java 处理时间提供了基础能力。

创建Date对象的方式较为简单,通过无参构造方法可以直接获取当前系统时间:

import java.util.Date;
public class DateDemo {public static void main(String[] args) {Date now = new Date();System.out.println("当前系统时间:" + now); }
}

上述代码的输出结果类似Thu Jul 23 10:00:00 CST 2025,能够直观地呈现当下的时间信息。

(二)Date 类的局限性

尽管Date类能够获取和表示时间,但在实际开发过程中,它的短板逐渐显现出来:

  • 可读性差:直接输出的时间格式对于普通用户而言不够友好,难以快速理解其中包含的具体年月日时分秒信息。
  • 操作不便捷:如果想要获取年、月、日等单独的时间字段,需要结合其他类(如Calendar),无法直接从Date对象中简洁地提取,这无疑增加了时间处理的复杂度。

二、格式化时间好帮手 ——SimpleDateFormat 类

(一)格式化与解析原理

SimpleDateFormat是java.text包下的一个类,它专门用于对Date类进行格式化(将Date对象转换为指定格式的字符串)和解析(将符合格式的字符串转换回Date对象)操作。通过自定义的模式字符串,SimpleDateFormat能够灵活地控制时间的展示样式。

(二)常用模式符号

掌握以下这些模式符号,就能根据需求定制出所需的时间格式:

  • y:表示年(例如yyyy表示四位年,yy表示两位年)
  • M:表示月(MM会补两位,1 月会显示为01)
  • d:表示日(dd会补两位)
  • H:表示时(采用 24 小时制,HH会补两位)
  • m:表示分(mm会补两位)
  • s:表示秒(ss会补两位)

(三)格式化操作示例

将Date对象转换为 “yyyy - MM - dd HH:mm:ss” 格式的字符串:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatParseDemo {public static void main(String[] args) {String timeStr = "2025-07-23 10:20:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date date = sdf.parse(timeStr);System.out.println("解析后的 Date 对象:" + date); } catch (ParseException e) {e.printStackTrace(); }}
}

运行上述代码后,时间会按照设定的格式输出,例如2025-07-23 10:15:30,大大提升了时间的可读性。

(四)解析操作示例

将符合格式的字符串转换回Date对象:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatParseDemo {public static void main(String[] args) {String timeStr = "2025-07-23 10:20:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date date = sdf.parse(timeStr);System.out.println("解析后的 Date 对象:" + date); } catch (ParseException e) {e.printStackTrace(); }}
}

需要注意的是,在进行解析操作时,字符串的格式必须和模式严格匹配,否则会抛出ParseException异常,因此要做好异常处理工作。

三、更灵活的时间操作工具 ——Calendar 类

(一)Calendar 类特点

Calendar是java.util包下的一个抽象类,与Date类相比,它提供了更为丰富的时间操作方法,能够方便地获取、设置时间字段(如年、月、日、时等),还支持对时间进行加减运算。

(二)获取 Calendar 实例

由于Calendar是抽象类,不能直接通过new关键字来创建实例,而是需要通过getInstance方法来获取:

import java.util.Calendar;
public class CalendarDemo {public static void main(String[] args) {Calendar calendar = Calendar.getInstance(); }
}

该方法返回的是GregorianCalendar实例(即公历),能够适配大部分的使用场景。

(三)常用方法及示例

  • 获取时间字段
int year = calendar.get(Calendar.YEAR); 
int month = calendar.get(Calendar.MONTH) + 1; // 月份从 0 开始,需要加 1
int day = calendar.get(Calendar.DAY_OF_MONTH); 
int hour = calendar.get(Calendar.HOUR_OF_DAY); // 采用24小时制
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
System.out.println("当前时间:" + year + "年" + month + "月" + day + "日 " + hour + ":" + minute + ":" + second);
  • 设置时间
calendar.set(Calendar.YEAR, 2026); 
calendar.set(Calendar.MONTH, Calendar.JANUARY); // 直接使用常量,更具语义性
calendar.set(Calendar.DAY_OF_MONTH, 1); 
// 也可以一次性设置多个字段
calendar.set(2026, Calendar.FEBRUARY, 14, 18, 30, 0); 
  • 时间加减
calendar.add(Calendar.DAY_OF_MONTH, 7); // 将当前时间加 7 天
calendar.add(Calendar.HOUR, -3); // 将当前时间减 3 小时

这些操作使得时间调整变得灵活高效,能够轻松实现诸如计算 “一周后的时间”“三小时前的时间” 等需求。

(四)与 Date 类相互转换

  • Date转Calendar:calendar.setTime(date);
  • Calendar转Date:Date date = calendar.getTime();

通过这种转换方式,能够在两种时间表示形式之间进行切换,以适配不同 API 的需求。

四、JDK8 时间类 —— 新时代的时间处理方案

JDK8 引入了全新的时间 API(位于java.time包下),解决了 JDK7 时间类存在的诸多痛点,如线程不安全、设计复杂等问题,以下是其中的核心类介绍:

(一)LocalDate、LocalTime、LocalDateTime

  • LocalDate:专注于处理日期(年、月、日),示例如下:
import java.time.LocalDate;
public class LocalDateDemo {public static void main(String[] args) {LocalDate nowDate = LocalDate.now(); System.out.println("当前日期:" + nowDate); LocalDate 指定日期 = LocalDate.of(2025, 7, 23); int year = 指定日期.getYear(); int month = 指定日期.getMonthValue(); int day = 指定日期.getDayOfMonth(); LocalDate 加 5 天 = 指定日期.plusDays(5); LocalDate 减 3 月 = 指定日期.minusMonths(3); }
}
  • LocalTime:用于处理时间(时、分、秒、纳秒),其用法与LocalDate类似,能够获取、设置、加减时间字段。
  • LocalDateTime:融合了日期和时间的信息,功能更为全面,例如:
import java.time.LocalDateTime;
public class LocalDateTimeDemo {public static void main(String[] args) {LocalDateTime nowDateTime = LocalDateTime.now(); LocalDateTime 指定时间 = LocalDateTime.of(2025, 7, 23, 10, 30, 0); // 支持丰富的时间调整,如调整到下一个周一、设置秒数等LocalDateTime 下周一 = nowDateTime.with(TemporalAdjusters.next(DayOfWeek.MONDAY)); }
}

(二)ZoneId 与 ZonedDateTime—— 时区处理

  • ZoneId:用于表示时区,例如ZoneId.of("Asia/Shanghai")可以获取上海时区。
  • ZonedDateTime:表示带时区的时间,它结合了LocalDateTime和ZoneId,能够解决跨时区时间处理的问题:
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class ZonedDateTimeDemo {public static void main(String[] args) {ZonedDateTime 上海时间 = ZonedDateTime.now(ZoneId.of("Asia/Shanghai")); ZonedDateTime 纽约时间 = ZonedDateTime.now(ZoneId.of("America/New_York")); // 时区转换ZonedDateTime 上海转纽约 = 上海时间.withZoneSameInstant(ZoneId.of("America/New_York")); }
}

(三)DateTimeFormatter—— 线程安全的格式化工具

DateTimeFormatter是 JDK8 中用于格式化和解析时间的类,它是线程安全的,可以替代SimpleDateFormat。示例如下:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTimeFormatterDemo {public static void main(String[] args) {LocalDateTime now = LocalDateTime.now();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formatStr = now.format(formatter); System.out.println("格式化后:" + formatStr); LocalDateTime parseTime = LocalDateTime.parse("2025-07-23 10:45:00", formatter); }
}

五、JDK7 与 JDK8 时间类对比与选择

(一)对比

  • 线程安全:JDK7 中的SimpleDateFormat是线程不安全的,而 JDK8 的时间类都是线程安全的。
  • 易用性:JDK8 时间类的方法更加直观、语义更清晰,例如LocalDate.plusDays比Calendar.add更容易理解。
  • 设计合理性:JDK8 时间类的职责单一(LocalDate负责处理日期、LocalTime负责处理时间),而 JDK7 的时间类功能较为混杂。

(二)选择建议

  • 新开发项目:优先使用 JDK8 的时间类,以享受其简洁、安全的 API。
  • 维护老项目:如果使用的是 JDK7 的时间类,要注意线程安全问题(例如对SimpleDateFormat进行加锁或使用ThreadLocal);也可以逐步将其迁移到 JDK8 的时间类,以提升代码质量。

六、总结

从 JDK7 的Date、SimpleDateFormat、Calendar,到 JDK8 的全新时间 API,Java 的时间处理能力在不断演进。在学习过程中,要理解不同类的适用场景,掌握核心方法,在实际开发中根据需求灵活选择合适的时间类。JDK8 的时间类代表了未来的发展趋势,值得深入学习和运用,从而让时间处理变得更加高效、简洁。随着对 Java 时间 API 的掌握愈发熟练,在处理日期时间相关需求时,也能更加得心应手,为构建健壮、易维护的 Java 程序奠定坚实的基础。

 

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

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

相关文章

duiLib 实现鼠标拖动标题栏时,窗口跟着拖动

1、布局文件,窗口需设置可拖动的标题栏区域:2、HandleMessage函数中,处理WM_LBUTTONDOWN消息,判断鼠标在标题栏,让系统处理窗口移动。代码片段如下:else if (uMsg WM_LBUTTONDOWN) {// 获取鼠标点击坐标PO…

图解嵌入式硬件知识库体系

构建一个嵌入式硬件知识库体系需要涵盖嵌入式系统设计、开发和应用的各个方面,内容全面且系统化,适合不同层次的用户。本文是一个结构化的嵌入式硬件知识库体系,包含主要内容模块及其详细说明。 @startmindmap * 嵌入式硬件知识库体系 ** 1. 嵌入式系统基础 *** 概述与定义 …

机器学习的特征工程(特征构造、特征选择、特征转换和特征提取)详解

特征工程是机器学习中至关重要的一步,它直接影响模型的性能和泛化能力。特征构造、特征选择、特征转换和特征提取——构成了特征工程的核心流程。下面我来系统地梳理一下它们的定义、方法和应用场景: 整理 by Moshow郑锴https://zhengkai.blog.csdn.net/…

Force Dimension触觉力反馈设备在外科手术机器人遥操作和训练中的应用

触觉力反馈设备通过传感器-执行器-信号处理闭环系统,在外科手术机器人领域实现了从远程手术操作到虚拟训练的全流程革新。外科手术机器人外科医生广博的专业知识往往受限于他们的主要工具——手。机器人的精确度和灵活性远远超过人手。然而,目前机器人还…

【网络与爬虫 00】试读

网络爬虫技术全栈指南:从入门到AI时代的数据采集革命 关键词:网络爬虫、Python爬虫、数据采集、反爬技术、分布式爬虫、AI爬虫、Scrapy框架、自动化数据提取、爬虫架构设计 摘要:本专栏是最全面的网络爬虫技术指南,涵盖从基础框架…

[Chat-LangChain] 前端用户界面 | 核心交互组件 | 会话流管理

链接:https://python.langchain.com/docs/tutorials/qa_chat_history/ Chat-LangChain技术栈 : LangChainLangGraphNext.jsWeaviate (向量存储)OpenAI (嵌入模型) docs:chat-langchain Chat LangChain 是一个智能聊天机器人,专为解答Lang…

编写和运行 Playbook

编写和运行 Playbook Playbook 介绍 adhoc 命令可以作为一次性命令对一组主机运行一项简单的任务。不过,若要真正发挥Ansible的能力,需要使用功能 playbook。 playbook 是一个文本文件,其中包含由一个或多个按特定顺序运行的play组成的列表。…

uniapp手机端video标签层级过高问题

当我们想以视频作为背景时,其他dom通过定位显示在视频上方,h5页面上调试发现可以正常使用,效果如下: 当放在手机上看,会发现,仅仅剩一个视频,本应在视频上层的元素不见了。 经过一番排查&#x…

【MyBatis批量更新实现】按照list传入批量更新

学习目标&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 显示数据、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通过VOFA显示数据波形。 一、VOFA 下载 VOFA 是一款面向嵌入式开发的上位机软件&#xff0c;专注于硬件数据实时可视化与调试。它通过高效协议&#xff08;如FireWater、JustFloat&#xff09;将原始字节流转化为…

MySQL 插入数据提示字段超出范围?一招解决 DECIMAL 类型踩坑

MySQL 插入数据提示字段超出范围&#xff1f;一招解决 DECIMAL 类型踩坑 在日常数据库操作中&#xff0c;我们经常会遇到各种字段类型相关的问题。今天就来聊聊一个常见的错误&#xff1a;插入数据时提示字段值超出范围&#xff0c;以实际案例带你搞懂 MySQL 中 DECIMAL 类型的…

一周学会Matplotlib3 Python 数据可视化-绘制误差条形图

锋哥原创的Matplotlib3 Python数据可视化视频教程&#xff1a; 2026版 Matplotlib3 Python 数据可视化 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 课程介绍 本课程讲解利用python进行数据可视化 科研绘图-Matplotlib&#xff0c;学习Matplotlib图形参数基本设置&…

JVM垃圾回收器

垃圾回收算法标记-复制缺点&#xff1a;内存利用率低&#xff0c;有一块区域无法使用。标记-清除缺点&#xff1a;1. 效率问题 (如果需要标记的对象太多&#xff0c;效率不高)2. 空间问题&#xff08;标记清除后会产生大量不连续的碎片&#xff09;标记-整理分代收集根据对象存…

科研工具的一些注意事项

Origin Origin导入数据之后&#xff0c;可以考虑 [删除数据连接器…] 导入数据之后&#xff0c;删除数据连接&#xff0c;这样当原来的文件移动之后&#xff0c;就不影响origin文件里面的数据。不然就会出现空白数据&#xff1a;当然&#xff0c;没有数据了也可以加载出来&…

美国服务器环境下Windows容器工作负载智能弹性伸缩

在北美数据中心加速数字化转型的今天&#xff0c;企业客户日益重视Windows容器工作负载的智能化管理。本文将深入探讨基于Azure Stack HCI&#xff08;混合云基础设施&#xff09;的弹性伸缩方案如何突破传统资源调度瓶颈&#xff0c;通过分析指标收集、策略配置、混合云联动三…

欧姆龙CP系列以太网通讯实现上位机与触摸屏监控

一、行业痛点在现代工业生产中&#xff0c;自动化生产线的控制系统的高效性与智能化程度对生产效率和产品质量有着至关重要的影响。然而&#xff0c;许多传统工业生产线中使用的欧姆龙CP系列系列PLC以太网模块&#xff0c;由于自身设计原因&#xff0c;并未配备以太网接口&…

【大语言模型 00】导读

【大语言模型00】导读&#xff1a;你的LLM全栈工程师进阶之路关键词&#xff1a;大语言模型、LLM、Transformer、深度学习、AI工程化、全栈开发、技术路线图摘要&#xff1a;这是一份完整的大语言模型学习指南&#xff0c;涵盖从数学基础到商业落地的200篇深度文章。无论你是AI…

Business Magic

题目描述There are n stores located along a street, numbered from 1 to n from nearest to farthest. Last month, the storek had a net profit of rk . If rk is positive, it represents a profit of rk dollars; if rk is negative, it represents a loss of −rk dolla…

在ubuntu系统上离线安装jenkins的做法

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 1.安装java环境和下载war包&#xff1a; Jenkins 依赖于 Java 环境&#xff08;OpenJDK 11 或更高版本&#xff09;&#xff1a; # 安装OpenJDK 11和字体依赖 sudo dpkg -i openjdk-11-jre-headless_*.deb fontconfi…

图像相似度算法汇总及Python实现

下面整理了一些图像相似度算法&#xff0c;可根据不同的需求选择不同的算法&#xff0c;对每种算法进行了简单描述并给出Python实现&#xff1a; 1. 基于像素的算法&#xff1a; (1).MSE(Mean Squared Error)&#xff1a;均方误差&#xff0c;通过计算两幅图像对应像素值差的平…