如果我喜欢以下内容,
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
。
有没有办法实现这个目标?
答案 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”
您必须了解Calendar
或Date
个对象是以自己的格式存储的,另一个是您打印它们的方式,所以在这种情况下,要查看2015-04-15T11:04:30.000Z
中的Calendar
1}}表示无关紧要,您需要的是2015-04-15
11:04:30
在Calendar
显示所需的格式只是为了方便用户输出。
您获得的输出来自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将仅打印出未定义的值。