Java日期时间处理详细方法与技巧

java 8 的 java.time 包相较于旧的 date 和 calendar api 提供了更强大、直观且线程安全的日期时间处理方案。1. 核心类包括 localdate(仅日期)、localtime(仅时间)、localdatetime(无时区的日期时间)、instant(时间戳)、zoneddatetime(带时区的日期时间)、duration(基于秒的时间差)和 period(基于年月日的时间差)。2. 这些类不可变,所有修改操作返回新实例,避免并发问题。3. 使用 datetimeformatter 实现线程安全的格式化与解析。4. 支持便捷的日期计算,如 plusdays、minusyears 等链式调用。5. 提供清晰的类型转换路径,支持与旧 api 的互操作。6. 相比之下,旧 api 存在可变性、不一致性和线程不安全等问题,应优先使用现代 api 以提升代码健壮性和可维护性。

Java日期时间处理详细方法与技巧

Java日期时间处理,从旧的java.util.Date和java.util.Calendar到现代的java.time包(JSR 310),经历了显著的演变。掌握后者是关键,它提供了更强大、更直观、线程安全的解决方案,极大地简化了日期时间的操作和计算,让开发者能更优雅地处理时间维度上的各种复杂需求。

Java日期时间处理详细方法与技巧

解决方案说实话,每次看到代码里还在大量用new Date()或者Calendar.getInstance(),我心里都会咯噔一下。这不仅仅是代码风格的问题,更是一个潜在的雷区。Java 8引入的java.time包彻底改变了我们处理日期时间的方式。它基于ISO 8601标准,提供了一套全新的、不可变且线程安全的API。

Java日期时间处理详细方法与技巧

核心思想是区分:

LocalDate: 只有日期,没有时间,也没有时区信息。比如“2023年10月27日”。LocalTime: 只有时间,没有日期,也没有时区信息。比如“下午3点30分”。LocalDateTime: 日期和时间都有,但没有时区信息。比如“2023年10月27日下午3点30分”。Instant: 时间线上的一个瞬时点,精确到纳秒,通常用于记录事件发生的时间戳。它不带时区,通常是UTC时间。ZonedDateTime: 带有完整时区信息的日期和时间。这是处理跨时区业务逻辑的关键。Duration: 用于表示两个Instant之间的时间量,基于秒和纳秒。Period: 用于表示两个LocalDate之间的时间量,基于年、月、日。

这些类都是不可变的,这意味着一旦创建,它们的值就不能被改变。所有修改操作(比如plusDays()、minusHours())都会返回一个新的实例,这极大地简化了并发编程,避免了旧API中常见的线程安全问题。

立即学习“Java免费学习笔记(深入)”;

Java日期时间处理详细方法与技巧

获取当前日期和时间:

LocalDate today = LocalDate.now(); // 今天的日期LocalTime now = LocalTime.now();   // 当前时间LocalDateTime currentDateTime = LocalDateTime.now(); // 当前日期和时间Instant currentInstant = Instant.now(); // 当前瞬时点(UTC)ZonedDateTime currentZonedDateTime = ZonedDateTime.now(); // 当前带时区日期时间

创建特定日期和时间:

LocalDate specificDate = LocalDate.of(2023, 10, 27);LocalTime specificTime = LocalTime.of(15, 30, 0);LocalDateTime specificDateTime = LocalDateTime.of(2023, 10, 27, 15, 30);

日期时间计算:java.time提供了非常直观的方法进行加减操作:

LocalDate nextWeek = today.plusWeeks(1);LocalDateTime nextMonthSameTime = currentDateTime.plusMonths(1);LocalDateTime twoHoursLater = currentDateTime.plusHours(2);LocalDate lastYear = today.minusYears(1);

格式化与解析:使用DateTimeFormatter进行日期时间的格式化和解析,它也是线程安全的:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String formattedDateTime = currentDateTime.format(formatter); // "2023-10-27 15:30:00" (示例)String dateString = "2024-01-01 10:00:00";LocalDateTime parsedDateTime = LocalDateTime.parse(dateString, formatter);

为什么我们应该放弃旧的Date和Calendar API?旧的java.util.Date和java.util.Calendar API,它们的设计确实存在一些先天不足,让开发者在实际使用中踩了不少坑。我个人觉得,最让人头疼的就是它们的“可变性”。当你把一个Date对象传递给某个方法,那个方法如果修改了它,你原始的Date对象也就跟着变了,这在多线程环境下简直是灾难,调试起来特别痛苦,常常出现意想不到的副作用。

Date类的命名本身也容易引起误解。它实际上代表的是一个时间点(精确到毫秒),而不是一个日期概念。比如,new Date()创建的是当前时间点,而不是“今天”这个日期。你想要获取年、月、日,还得借助Calendar。

而Calendar呢?它的API设计过于冗长和复杂。比如,月份是从0开始的(0代表1月),这导致了无数的“差一”错误。还有,它同样是可变的,也不是线程安全的。这意味着在并发场景下,你需要手动进行同步,这无疑增加了开发的复杂性和出错的概率。

所以,放弃它们不是为了追新,而是为了规避这些历史遗留问题,让代码更健壮、更易读、更易维护。

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

java.time包的核心类如何简化日期时间操作?java.time包的设计哲学就是“分而治之”和“不可变性”。它把日期、时间、日期时间、瞬时点、时区等概念都用独立的、职责单一的类来表示,这让代码的意图变得非常清晰。

LocalDate: 想象一下,你只想知道今天是几月几号,不需要关心现在是几点几分几秒,也不需要关心你在哪个时区。LocalDate就是为此而生。比如,记录一个人的生日,或者一个节假日,LocalDate.of(1990, 5, 15)就足够了。LocalTime: 类似地,如果你只想表示一个时间点,比如商店的开门时间“上午9点”,LocalTime.of(9, 0)就非常直观。LocalDateTime: 当你需要同时表示日期和时间,但又不涉及跨时区转换时,LocalDateTime是你的首选。比如,一个会议的开始时间,或者一个日志事件的发生时间。它不包含时区信息,所以如果你在伦敦和纽约同时用LocalDateTime.now(),得到的结果会是各自本地的日期时间。Instant: 这是一个非常底层的概念,它代表了时间线上的一个精确点,通常是自UNIX纪元(1970-01-01T00:00:00Z)以来的秒数和纳秒数。它不带任何时区概念,是处理时间戳、数据库存储或网络传输时非常方便的统一表示。ZonedDateTime: 这是处理时区问题的终极武器。它包含了LocalDateTime的所有信息,再加上一个ZoneId(时区ID)。当你需要安排一个跨国会议,或者处理不同时区用户提交的数据时,ZonedDateTime能确保时间转换的准确性。比如,北京时间下午3点的会议,在纽约是凌晨3点,ZonedDateTime能帮你正确地进行这些转换。Duration与Period: 这对搭档用于计算时间差。Duration侧重于时间量,比如“两个小时”或“30秒”,它适用于Instant或LocalTime之间的计算。而Period则侧重于日期量,比如“两年三个月零五天”,它适用于LocalDate之间的计算。这种区分让时间差的计算变得非常语义化。

这些类的操作方法都采用了链式调用,例如LocalDate.now().plusDays(1).minusMonths(2),这让代码读起来就像自然语言一样流畅。

如何在不同日期时间类型之间进行转换和格式化?在实际开发中,不同日期时间类型之间的转换和字符串的格式化与解析是家常便饭。java.time提供了非常清晰的路径。

类型转换:从旧的java.util.Date到新的java.time:

java.util.Date oldDate = new java.util.Date();Instant instant = oldDate.toInstant(); // Date -> InstantLocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // Instant -> LocalDateTime (带上系统默认时区)ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.of("America/New_York")); // Instant -> ZonedDateTime (指定时区)

从新的java.time到旧的java.util.Date:

LocalDateTime newDateTime = LocalDateTime.now();// LocalDateTime -> Instant -> Date (需要一个时区来确定Instant)java.util.Date convertedDate = java.util.Date.from(newDateTime.atZone(ZoneId.systemDefault()).toInstant());

LocalDateTime与ZonedDateTime之间的转换:

LocalDateTime ldt = LocalDateTime.now();ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault()); // 给LocalDateTime加上系统默认时区ZonedDateTime specificZdt = ZonedDateTime.now(ZoneId.of("Europe/London"));LocalDateTime convertedLdt = specificZdt.toLocalDateTime(); // ZonedDateTime -> LocalDateTime (丢失时区信息)

要注意的是,从ZonedDateTime转换到LocalDateTime会丢失时区信息,因为LocalDateTime本身就不包含时区。

格式化与解析:格式化这块,说实话,一开始我总记不住那些字母代表什么,比如yyyy是年,MM是月,dd是日。但用多了就发现,它比以前的SimpleDateFormat好用太多了,至少不用担心线程安全问题了。

DateTimeFormatter是核心,它提供了多种创建方式:

预定义常量: 针对常见格式,比如ISO_DATE、ISO_DATE_TIME。

LocalDateTime now = LocalDateTime.now();String isoDate = now.format(DateTimeFormatter.ISO_LOCAL_DATE); // "2023-10-27"String isoDateTime = now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); // "2023-10-27T15:30:00"

自定义模式: 使用ofPattern()方法,你可以根据需求定义任意格式。

DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");String chineseFormat = now.format(customFormatter); // "2023年10月27日 15:30:00"

这里需要注意大小写:MM是月份,mm是分钟;HH是24小时制,hh是12小时制。

解析字符串到日期时间对象:

String dateStr = "2023-10-27 15:30:00";DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime parsed = LocalDateTime.parse(dateStr, parser);String dateOnlyStr = "2023-10-27";LocalDate parsedDate = LocalDate.parse(dateOnlyStr, DateTimeFormatter.ISO_LOCAL_DATE);

如果字符串格式与解析器不匹配,会抛出DateTimeParseException。在处理用户输入或外部数据时,务必做好异常处理。DateTimeFormatter是线程安全的,所以你可以把它定义为常量或静态变量,在整个应用中复用。这与旧的SimpleDateFormat形成了鲜明对比,后者每次使用都建议重新创建,以避免线程问题。

以上就是Java日期时间处理详细方法与技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/252594.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
微软 Copilot Labs 上线“音频表达式”功能
上一篇 2026年10月9日 05:32:58
Python怎样实现图像分割?深度学习应用案例
下一篇 2025年12月14日 04:16:21

相关推荐

  • 闲鱼双十一怎么设置高价出售商品_闲鱼11.11高价出售商品技巧

    闲鱼双十一怎么设置高价出售商品_闲鱼11.11高价出售商品技巧闲鱼双十一怎么设置高价出售商品_闲鱼11.11高价出售商品技巧闲鱼双十一怎么设置高价出售商品_闲鱼11.11高价出售商品技巧闲鱼双十一怎么设置高价出售商品_闲鱼11.11高价出售商品技巧

    高价商品可通过心理定价、视觉优化、套餐设置与信用背书提升转化。1、用“.99”结尾定价并添加“双十一限定”标签增强吸引力;2、上传高清图与短视频展示质感,主图标注“正品”“全套包装”;3、设基础、标准、尊享三档套餐,对比原价突出特惠;4、开启花呗分期与验货宝,提供凭证、发票强化信任。 如果您计划在闲…

    2026年10月9日 • 用户投稿
    000
  • UJCMS 9.9.0 发布,Java CMS 网站内容管理系统

    UJCMS 9.9.0 发布,Java CMS 网站内容管理系统UJCMS 9.9.0 发布,Java CMS 网站内容管理系统UJCMS 9.9.0 发布,Java CMS 网站内容管理系统UJCMS 9.9.0 发布,Java CMS 网站内容管理系统

    更新日志 新增表单对象标签 优化数据库备份功能 前台全文检索可以搜索图片集名称和描述 Dockerfile 优化 cnb 流水线优化 立即学习“Java免费学习笔记(深入)”; 修复文章审核时,文章数据权限的问题 修复区块项无法排序的问题 简介 UJCMS 是一款基于 Java 的企业级网站内容管理…

    2026年10月9日 • 用户投稿
    000
  • composer是如何决定一个包是开发依赖还是生产依赖的

    composer是如何决定一个包是开发依赖还是生产依赖的composer是如何决定一个包是开发依赖还是生产依赖的composer是如何决定一个包是开发依赖还是生产依赖的composer是如何决定一个包是开发依赖还是生产依赖的

    Composer通过composer.json中的”require”和”require-dev”字段区分生产与开发依赖,前者用于运行时必需的包,后者仅用于开发测试;2. 默认安装会包含两者,但生产环境应使用composer install &#8211…

    2026年10月9日 • 用户投稿
    000
  • Spring事件驱动模型的实战应用

    Spring事件驱动模型的实战应用Spring事件驱动模型的实战应用Spring事件驱动模型的实战应用Spring事件驱动模型的实战应用

    spring事件驱动模型通过三步实现解耦:定义事件、定义监听器、发布事件。1. 定义事件需继承applicationevent;2. 使用@eventlistener注解定义监听器;3. 通过applicationeventpublisher发布事件。它解决了代码臃肿、高耦合带来的维护困难、扩展性差…

    2026年10月9日 • 用户投稿
    200
  • 笔灵ai降重有用吗安全吗

    笔灵ai降重有用吗安全吗笔灵ai降重有用吗安全吗笔灵ai降重有用吗安全吗笔灵ai降重有用吗安全吗

    笔灵ai降重工具有用且安全,但需谨慎使用。1) 它能快速生成低重复率文本,适合学术和博客写作。2) 用户需校对以保持原意和自然性。3) 避免输入敏感信息,定期更新密码以保障安全。4) 可尝试不同模式优化结果,但勿过度依赖,需结合人工校对。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无…

    2026年10月9日 • 用户投稿
    100
  • Spring Security权限控制完整实现教程

    Spring Security权限控制完整实现教程Spring Security权限控制完整实现教程Spring Security权限控制完整实现教程Spring Security权限控制完整实现教程

    引入spring security依赖;2. 创建安全配置类并定义passwordencoder、userdetailsservice和securityfilterchain bean;3. 通过authorizehttprequests配置url权限;4. 使用formlogin和logout配置…

    2026年10月9日 • 用户投稿
    100
  • 如何解决ACFPro项目中的静态分析困境,使用Composer和php-stubs/acf-pro-stubs提升代码质量

    如何解决ACFPro项目中的静态分析困境,使用Composer和php-stubs/acf-pro-stubs提升代码质量如何解决ACFPro项目中的静态分析困境,使用Composer和php-stubs/acf-pro-stubs提升代码质量如何解决ACFPro项目中的静态分析困境,使用Composer和php-stubs/acf-pro-stubs提升代码质量如何解决ACFPro项目中的静态分析困境,使用Composer和php-stubs/acf-pro-stubs提升代码质量

    可以通过一下地址学习composer:学习地址 作为一名 WordPress 开发者,Advanced Custom Fields Pro (ACF Pro) 无疑是我们的得力助手,它极大地简化了自定义字段的管理和使用。然而,当我们将现代 PHP 开发中不可或缺的静态分析工具(例如 PHPStan …

    2026年10月9日 • 用户投稿
    000
  • composer的bin-dir配置项详解

    composer的bin-dir配置项详解composer的bin-dir配置项详解composer的bin-dir配置项详解composer的bin-dir配置项详解

    bin-dir配置指定Composer可执行脚本存放路径,默认为vendor/bin;2. 可在composer.json中通过config设置自定义路径如”bin-dir”: “bin”;3. 修改后执行composer install/update…

    2026年10月9日 • 用户投稿
    100
  • 为什么电脑开始菜单栏到侧面去了

    为什么电脑开始菜单栏到侧面去了为什么电脑开始菜单栏到侧面去了为什么电脑开始菜单栏到侧面去了为什么电脑开始菜单栏到侧面去了

    此问题的产生原因在于开始菜单栏未处于锁定状态。 要解决这一问题,请按照以下步骤操作:使用鼠标左键按住任务栏,并将其拖至屏幕底部。随后,在任务栏的空白区域右击,选择“锁定任务栏”,这样就能避免再次发生类似情况。 青柚面试 简单好用的日语面试辅助工具 57 查看详情 以上就是为什么电脑开始菜单栏到侧面去…

    2026年10月9日 • 用户投稿
    100
  • composer.lock文件中的”content-hash”是什么

    composer.lock文件中的”content-hash”是什么composer.lock文件中的”content-hash”是什么composer.lock文件中的”content-hash”是什么composer.lock文件中的”content-hash”是什么

    content-hash 是 Composer.lock 中的哈希值,用于检测项目依赖是否变更。它基于 composer.json、composer.lock(若存在)、已安装包的版本信息及平台配置(如 PHP 版本和扩展)计算得出。运行 composer install 时,Composer 会重…

    2026年10月9日 • 用户投稿
    100
  • 打开网页为什么老跳到搜狗?

    打开网页为什么老跳到搜狗?打开网页为什么老跳到搜狗?打开网页为什么老跳到搜狗?打开网页为什么老跳到搜狗?

    为何每次打开网页都跳转至搜狗?浏览器频繁弹出搜狗的问题该如何应对?如果你也遇到了类似的情况,不妨参考以下方法来解决问题。 解决打开网页总跳到搜狗的方法 最简单的解决方式就是将你常用的浏览器设为默认浏览器。 首先打开控制面板,选择“程序”选项,然后点击“设置默认程序”。 纳米搜索 纳米搜索:360推出…

    2026年10月9日 • 用户投稿
    200
  • 通义灵码idea怎么安装不了怎么办

    通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办通义灵码idea怎么安装不了怎么办

    通义灵码idea安装失败的常见原因包括:1.系统兼容性问题,需确认系统版本是否满足要求;2.网络连接问题,确保网络稳定;3.安装包损坏,需重新下载;4.权限问题,以管理员身份运行安装程序。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 通义…

    2026年10月8日 • 用户投稿
    200
  • 2021 年 Windows 成了 Python 开发者的首选

    2021 年 Windows 成了 Python 开发者的首选2021 年 Windows 成了 Python 开发者的首选2021 年 Windows 成了 Python 开发者的首选2021 年 Windows 成了 Python 开发者的首选

    近年来,苹果的笔记本电脑硬件设计决策让我感到非常失望,因此我决定不再在这个平台上进行个人工作。尽管最新的硬件有所改进,但我已做出决定,短期内不会改变主意。 我的首选是 Linux 桌面系统,但经过几个月与不稳定性和可访问性问题的艰苦斗争后,我不得不承认,我一直在寻找一个稳定可靠的替代方案,希望找到一…

    2026年10月8日 • 用户投稿
    300
  • Java中不使用Math.sqrt函数判断一个数是否为完全平方数

    Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数Java中不使用Math.sqrt函数判断一个数是否为完全平方数

    本教程旨在探讨在Java中不依赖Math.sqrt函数的情况下,如何判断一个整数是否为完全平方数。文章将首先分析常见错误,随后详细介绍两种迭代检测方法:一种是直接比较平方值,另一种是利用除数与商的关系。通过代码示例和注意事项,帮助读者理解并实现高效的完全平方数判断逻辑。 什么是完全平方数? 完全平方…

    2026年10月8日 • 用户投稿
    100
  • 使用Java实现支付宝支付接口的完整对接教程

    使用Java实现支付宝支付接口的完整对接教程使用Java实现支付宝支付接口的完整对接教程使用Java实现支付宝支付接口的完整对接教程使用Java实现支付宝支付接口的完整对接教程

    实现支付宝支付接口的核心步骤包括:1.引入sdk并配置依赖;2.在支付宝开放平台创建应用获取密钥;3.初始化alipayclient配置通信参数;4.构造不同类型的支付请求并设置业务参数;5.发送请求并处理返回结果;6.重点处理异步通知需验签、校验订单信息并确保幂等性。常见安全风险及应对措施包括:1…

    2026年10月8日 • 用户投稿
    300
  • chrome浏览器最新官方下载地址 chrome浏览器官网首页直接打开

    Chrome浏览器最新官方下载地址是https://www.google.com/chrome/,该网站提供安全稳定的浏览体验,采用沙盒技术和内置安全功能保护用户,具备高效性能与便捷设计,支持跨设备同步和智能预加载。 chrome浏览器最新官方下载地址在哪里?这是不少网友都关注的,接下来由PHP小编…

    2026年10月8日
    100
  • 如何利用PHP递增实现简单的进度条功能_PHP进度条递增实现教程

    通过PHP结合JavaScript和flush()函数可实现页面进度条递增。利用循环模拟任务执行,在每次迭代中更新进度并强制输出缓冲内容,使浏览器实时显示进度。示例包含基础进度条和处理100项数据的应用场景,适合长时间脚本的可视化反馈。需注意输出缓冲设置、服务器缓存影响及适用场景限制,建议复杂应用采…

    2026年10月8日
    100
  • mac重启要输入名称和密码

    mac重启要输入名称和密码mac重启要输入名称和密码mac重启要输入名称和密码mac重启要输入名称和密码

    Mac重启后要求输入名称和密码是正常安全机制,主要因FileVault磁盘加密功能启用所致。第一次输入密码用于解锁加密的启动磁盘(FileVault解锁),确保数据安全;第二次输入密码是登录用户账户,验证身份并进入个人系统环境。两者作用不同:前者保护静态数据,防止设备丢失时信息泄露;后者控制用户会话…

    2026年10月8日 • 用户投稿
    200
  • 如何用composer管理前端资源(assets)

    如何用composer管理前端资源(assets)如何用composer管理前端资源(assets)如何用composer管理前端资源(assets)如何用composer管理前端资源(assets)

    可通过Composer管理前端资源,主要方法有:1. 安装前端库的PHP封装包,如twbs/bootstrap;2. 利用post-install-cmd脚本自动复制资源到public目录;3. 使用Asset Packagist和php-asset插件直接集成npm包;4. 结合npm与Webpa…

    2026年10月8日 • 用户投稿
    900
  • 如何在Windows上查看XML文件?使用文本编辑器的快速教程

    如何在Windows上查看XML文件?使用文本编辑器的快速教程如何在Windows上查看XML文件?使用文本编辑器的快速教程如何在Windows上查看XML文件?使用文本编辑器的快速教程如何在Windows上查看XML文件?使用文本编辑器的快速教程

    使用文本编辑器是查看XML文件最直接的方式,因其提供无渲染的原始视图,避免浏览器或专用工具对内容的“智能”处理。Windows系统自带的记事本虽可打开XML,但功能有限;推荐使用Notepad++或VS Code等高级编辑器,它们支持语法高亮、代码折叠、树状视图和正则搜索,显著提升阅读与定位效率。面…

    2026年10月8日 • 用户投稿
    300

发表回复

登录后才能评论
关注微信