求助:将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
相关产品推荐
相关产品推荐

