当前位置: 首页 > news >正文

XMLGregorianCalendar跟Date、localDateTime以及String有什么区别

1. java.util.Date(已过时,不推荐新代码使用)

特点

  • 表示时间戳:存储自 1970-01-01 00:00:00 UTC(Unix 纪元) 以来的毫秒数。

  • 问题

    • 不区分日期和时间,也没有时区支持(依赖系统默认时区)。

    • 可变性(非线程安全)。

    • API 设计差(大部分方法已废弃,如 getYear() 返回的是 year - 1900)。

示例

Date date = new Date();  // 当前时间(包含毫秒)
System.out.println(date); // 输出:Thu Jun 06 18:30:45 CST 2024

2. java.time.LocalDateTime(Java 8+ 推荐)

特点

  • 不可变且线程安全,属于现代日期时间 API(java.time 包)。

  • 无时区信息,仅表示本地日期时间(如 2024-06-06T18:30:45)。

  • 支持精确到纳秒,并提供丰富的操作方法(如 plusDays()isBefore())。

示例

LocalDateTime now = LocalDateTime.now(); // 当前本地时间
System.out.println(now); // 输出:2024-06-06T18:30:45.123456789

3. javax.xml.datatype.XMLGregorianCalendar(XML 交互专用)

特点

  • 专为 XML 序列化设计(如 SOAP/WSDL、XSD 的 xs:dateTime 类型)。

  • 可表示时区(比 LocalDateTime 更灵活)。

  • 底层依赖 GregorianCalendar,支持任意精度(年、月、日、时、分、秒、毫秒等)。

示例

XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar("2024-06-06T18:30:45+08:00");
System.out.println(xmlDate); // 输出:2024-06-06T18:30:45+08:00

4. String(纯文本表示)

特点

  • 无内置日期时间逻辑,仅作为格式化后的文本(如 "2024-06-06 18:30:45")。

  • 需手动解析/格式化(易出错,推荐用 DateTimeFormatter 处理)。

示例

String dateStr = "2024-06-06T18:30:45";
LocalDateTime parsedDate = LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME);

对比总结

特性DateLocalDateTimeXMLGregorianCalendarString
设计目的旧版时间戳本地日期时间(无时区)XML/WSDL 交互纯文本
时区支持依赖系统默认支持
可变性可变(非线程安全)不可变(线程安全)不可变不可变
精度毫秒纳秒任意精度依赖格式
推荐使用场景遗留代码现代 Java 应用XML/WebService显示或简单存储

如何选择?

  1. 新代码优先用 LocalDateTime(Java 8+ 标准,清晰易用)。

  2. XML/SOAP 交互用 XMLGregorianCalendar(与 XSD xs:dateTime 兼容)。

  3. 避免直接使用 Date(除非维护旧系统)。

  4. String 仅用于显示或简单存储,解析时需配合 DateTimeFormatter

转换示例

LocalDateTime ↔ XMLGregorianCalendar

// LocalDateTime → XMLGregorianCalendar
LocalDateTime ldt = LocalDateTime.now();
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(ldt.toString());// XMLGregorianCalendar → LocalDateTime
LocalDateTime fromXml = xmlDate.toGregorianCalendar().toZonedDateTime().toLocalDateTime();

Date ↔ LocalDateTime

// Date → LocalDateTime
Date date = new Date();
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();// LocalDateTime → Date
Date fromLdt = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

相关文章:

  • VisualXML全新升级 | 新增数据库编辑功能
  • 【深度学习新浪潮】大模型中,active parameters和total parameters都是什么?
  • rnn判断string中第一次出现a的下标
  • Unity-ECS详解
  • Ubuntu里面单独编译某一个模块
  • DriveGPT4: Interpretable End-to-end Autonomous Driving via Large Language Model
  • FreeRTOS学习02_任务管理
  • [论文阅读]人工智能 | CoMemo:给大视觉语言模型装个“图像记忆”
  • 一种使用 PowerToys 的键盘管理器工具重新映射按键实现在 Windows 上快捷输入字符的方式
  • 在Spring Boot中集成RabbitMQ的完整指南
  • iview组件库:使用Menu组件时手风琴属性accordion失效的解决方案
  • C#模式匹配深度解析与最佳实践
  • 【C#】多级缓存与多核CPU
  • 图解C#教程 第五版 第4章 类型、存储和变量 笔记
  • Ace网络验证软件卡密系统-免费免搭建 记录整理
  • 电脑插入多块移动硬盘后经常出现卡顿和蓝屏
  • Promise 链式调用:让异步编程更优雅
  • (1-6-4) Java IO流实现文件的读取与写入
  • 冯诺依曼架构是什么?
  • C语言 学习 模块化编程 2025年6月9日19:39:17
  • wordpress新站注意事项/lpl赛区战绩
  • 做模板网站赚钱吗/媒体发稿网
  • 汕头潮南区/seo百度关键词排名
  • 郑州做网站要/免费网站制作
  • 长沙门户网站建设/抖音十大搜索关键词
  • 深圳建工集团/seo外链推广工具下载