如何为XMLGregorianCalendar日期添加5天延迟?求更简便实现方法
为XMLGregorianCalendar日期添加延迟的简便实现方法
错误原因说明
你第二种方法的编译错误,是因为XMLGregorianCalendar.add()方法的返回值是void——它会直接修改调用该方法的原对象,而非返回一个新的XMLGregorianCalendar实例。所以你不能把add()的调用结果直接传给DateUtil.convertToTimestamp(),这就是报错提示"Required type: XMLGregorianCalendar, Provided: void"的原因。
更简便的实现方案
方案1:直接操作XMLGregorianCalendar(无需转换Java 8+时间类)
既然add()是原地修改对象,拆分步骤即可解决问题。如果原对象允许被修改:
XMLGregorianCalendar originalDate = request.getDate(); // 创建代表5天的Duration对象 Duration fiveDays = DatatypeFactory.newInstance().newDuration("P5D"); // 直接给原日期添加5天 originalDate.add(fiveDays); // 转换为Timestamp Timestamp ts = DateUtil.convertToTimestamp(originalDate);
如果原XMLGregorianCalendar对象不可修改(比如来自外部请求的只读对象),先克隆实例再修改:
XMLGregorianCalendar originalDate = request.getDate(); // 克隆一个新的实例 XMLGregorianCalendar newDate = (XMLGregorianCalendar) originalDate.clone(); newDate.add(DatatypeFactory.newInstance().newDuration("P5D")); Timestamp ts = DateUtil.convertToTimestamp(newDate);
方案2:简化Java 8+时间API转换流程
你原来的转换逻辑可以进一步简化,同时注意时区处理(避免丢失时区信息引发的潜在问题):
// 保留时区信息的转换方式 ZonedDateTime zonedDate = request.getDate().toGregorianCalendar().toZonedDateTime(); Timestamp ts = Timestamp.from(zonedDate.plusDays(5).toInstant());
如果确定不需要时区信息,也可以缩短链式调用:
Timestamp ts = Timestamp.valueOf( request.getDate().toGregorianCalendar() .toZonedDateTime() .toLocalDateTime() .plusDays(5) );
总结
- 若不想引入Java 8+新时间类,
clone()+add()的方式最直接,完全基于XMLGregorianCalendar自身API实现; - 若偏好Java 8+时间API,带时区的ZonedDateTime转换更严谨,能避免跨时区场景下的日期偏差问题。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

