从 XMLGregorianCalender 中删除 "Z" 部分

Removing "Z" part from XMLGregorianCalender

当我在下方点赞时,

GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.setTime(startTime);  // startTime Date
DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);

我得到类似 2015-04-15T11:04:30.000Z 的输出。

我希望它像 2015-04-15T11:04:30.000

有办法实现吗?

这是因为您的语言环境时区,要实现您需要的转换日期,请使用 SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

更新 当你发表评论时:

I tried formatting it to a String then again parsing it to a Date. Then setting time in Calender object. Does not work. Still i get output as "2015-04-15T11:04:30.000Z"

您必须了解 CalendarDate 对象以其自己的格式存储,另一件事是如何打印它们,所以在这种情况下,请参阅 2015-04-15T11:04:30.000Z Calendar 表示并不重要,您需要的是在 11:04:30 处有正确的日期 2015-04-15 以所需的格式显示它只是为了使您的输出对用户友好。

您得到的输出来自 Calendar.toString() 并且方法文档说:

Return a string representation of this calendar. This method is intended to be used only for debugging purposes, and the format of the returned string may vary between implementations. The returned string may be empty but may not be null.

所以为了存储日期和时间,你的Calendar对象是正确的。为了打印它,您必须将其转换为 String.

按如下操作

DatatypeFactory df; 
try { 
    df = DatatypeFactory.newInstance(); 
    return df.newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")); 
} catch (DatatypeConfigurationException e) { 
    // throw new SomeRuntimeException(e); 
}

或者从 XMLGregorianCalendar 扩展新的 class,覆盖 toXMLFormat,然后将所有其他方法委托给包含的实例。

class CustomXMLGregorianCalendar extends XMLGregorianCalendar
{
    XMLGregorianCalendar calendar;

    CustomXMLGregorianCalendar(XMLGregorianCalendar calendar){
        this.calendar = calendar;
    }

    public String toXMLFormat() {
        String text = calendar.toXMLFormat();
        int pos = text.indexOf('Z');

        return pos < 0 ? text : text.substring(0,pos);
    }

    public void setTimezone(int offset){ calendar.setTimezone( offset ); }
    // ...
}

已接受的答案或我的 Java 似乎已过时,因为我收到此错误: The method newXMLGregorianCalendar(String) in the type DatatypeFactory is not applicable for the arguments (SimpleDateFormat)

我不想延长,所以我通过删除时区解决了这个问题:

    xmlCalendar.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

如果您只想从 XMLGregorianCalendar 对象中删除 "Z",只需调用此方法即可。

xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED)

我遇到过这种情况,使用这条线就解决了:

XMLGregorianCalendar dateNew = DatatypeFactory.newInstance().newXMLGregorianCalendar("2017-09-06T21:08:14");

我遇到了类似的问题。我把它放在这里是为了之后出现的任何人,但解决了我的问题类似于 Ignas Vaitekunas 最终是如何做到的。

我用过

XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar());
xgc.setYear(year);
xgc.setMonth(month);
xgc.setDay(day);
xgc.setHour(hour);
xgc.setMinute(min);
xgc.setSecond(second);
xgc.setTimezone(timezone);

其中年、月、日、时、分、秒、时区初始设置为DatatypeConstants.FIELD_UNDEFINED

我从显示给用户的格式文本字段中提取值,格式为“ - - T : : Z”。用户填写他们拥有的信息,我拆分并解析字符串,如果我有时区值(或秒、分钟或小时等),我设置它,如果没有,它将作为未定义字段馈送到 xgc .然后 XML 公历将仅打印出未定义的值。