从XMLGregorianCalender中删除“Z”部分

时间:2015-05-18 08:12:05

标签: java xsd gregorian-calendar

如果我喜欢以下内容,

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

有没有办法实现这个目标?

6 个答案:

答案 0 :(得分:9)

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

我不想延长,所以我通过删除时区来解决它:

    xmlCalendar.setTimezone(DatatypeConstants.FIELD_UNDEFINED);

答案 1 :(得分:3)

如果您只想从XMLGregorianCalendar对象中删除“Z”,请调用此方法。

xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED)

答案 2 :(得分:2)

这是因为您的区域设置时区,要实现您需要的内容,请使用SimpleDateFormat转换日期:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
您发表评论时

更新

  

我尝试将其格式化为String然后再将其解析为Date。然后在Calender对象中设置时间。不行。我仍然输出为“2015-04-15T11:04:30.000Z”

您必须了解CalendarDate个对象是以自己的格式存储的,另一个是您打印它们的方式,所以在这种情况下,要查看2015-04-15T11:04:30.000Z中的Calendar 1}}表示无关紧要,您需要的是2015-04-15 11:04:30Calendar显示所需的格式只是为了方便用户输出。

您获得的输出来自Calendar.toString(),方法doc说:

  

返回此日历的字符串表示形式。 此方法仅用于调试目的,返回字符串的格式可能因实现而异。返回的字符串可能为空,但可能不为空。

因此,为了存储日期和时间,您的String对象是正确的。要进行打印,您必须将其转换为{{1}}。

答案 3 :(得分:1)

按照以下方式执行

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扩展新类,覆盖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 ); }
    // ...
}

答案 4 :(得分:0)

我遇到了这种情况并且已经解决了,使用这一行:

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

答案 5 :(得分:0)

我有类似的问题。我把它放在这里的任何人之后,但解决了我的问题,类似于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 as和undefined字段。然后,XML Gregorian Calendar将仅打印出未定义的值。