You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将XMLGregorianCalendar类型数值转为可读日期时间

解决XMLGregorianCalendar转人类可读日期时间的问题

嘿,这个场景我之前刚好处理过,给你一步步拆解怎么搞定:

首先先明确你拿到的两个XMLGregorianCalendar对象对应的数值含义:

  • SUBMIT_DATE: 1516032000000 是从epoch时间(1970-01-01 00:00:00 UTC)开始的毫秒数,对应具体的日期(这个数值转出来是2018-01-16)
  • SUBMIT_TIME: 36895000 是当天从00:00:00开始的毫秒数(换算下来是10小时14分55秒)

下面分两种Java版本给你具体实现方案:

Java 8+ 推荐方案(使用java.time API)

Java 8之后的新时间API更简洁且线程安全,优先用这个:

// 假设你已经获取到了两个XMLGregorianCalendar实例
XMLGregorianCalendar submitDateXml = ...;
XMLGregorianCalendar submitTimeXml = ...;

// 1. 处理日期部分:转成LocalDate
Instant dateInstant = submitDateXml.toGregorianCalendar().toInstant();
// 建议指定明确时区,比如Asia/Shanghai,避免环境时区差异
LocalDate submitDate = dateInstant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();

// 2. 处理时间部分:将当天毫秒数转成Duration,再合并到日期上得到完整时间
long timeMillis = submitTimeXml.toGregorianCalendar().getTimeInMillis();
Duration timeDuration = Duration.ofMillis(timeMillis);
LocalDateTime submitDateTime = LocalDateTime.of(submitDate, LocalTime.MIN).plus(timeDuration);

// 3. 格式化输出
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
DateTimeFormatter fullFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

String readableDate = submitDate.format(dateFormatter);
String readableTime = submitDateTime.toLocalTime().format(timeFormatter);
String fullDateTime = submitDateTime.format(fullFormatter);

// 输出结果
System.out.println("可读日期:" + readableDate);
System.out.println("可读时间:" + readableTime);
System.out.println("完整日期时间:" + fullDateTime);

Java 7及以下兼容方案

如果项目还在用旧版本Java,用Calendar和SimpleDateFormat来处理:

XMLGregorianCalendar submitDateXml = ...;
XMLGregorianCalendar submitTimeXml = ...;

// 1. 处理日期部分
GregorianCalendar dateCal = submitDateXml.toGregorianCalendar();
Date submitDate = dateCal.getTime();
SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd");
// 同样建议指定时区
dateSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
String readableDate = dateSdf.format(submitDate);

// 2. 处理时间部分:将毫秒数转成时分秒
long timeMillis = submitTimeXml.toGregorianCalendar().getTimeInMillis();
int totalSeconds = (int) (timeMillis / 1000);
int hours = totalSeconds / 3600;
int minutes = (totalSeconds % 3600) / 60;
int seconds = totalSeconds % 60;
String readableTime = String.format("%02d:%02d:%02d", hours, minutes, seconds);

// 3. 合并日期和时间
Calendar fullCal = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai"));
fullCal.setTime(submitDate);
fullCal.set(Calendar.HOUR_OF_DAY, hours);
fullCal.set(Calendar.MINUTE, minutes);
fullCal.set(Calendar.SECOND, seconds);
SimpleDateFormat fullSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
fullSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
String fullDateTime = fullSdf.format(fullCal.getTime());

// 输出结果
System.out.println("可读日期:" + readableDate);
System.out.println("可读时间:" + readableTime);
System.out.println("完整日期时间:" + fullDateTime);

关键注意点

  • 时区问题:一定要指定明确的时区,否则不同环境下转出来的日期可能有偏差(比如UTC和北京时间差8小时)
  • 如果你的XMLGregorianCalendar对象本身已经包含了时区信息,也可以直接用它自带的时区来转换,不用额外指定

内容的提问来源于stack exchange,提问作者Beta_Meow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:31:31