我想使用XMLGregorianCalendar
格式的日期发送到网络服务。 Web服务需要yyyy-dd-mm
格式的信息。我使用以下代码创建XMLGregorianCalendar
并将其发送到Web服务。
Date dob = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
XMLGregorianCalendar date2;
dob = df.parse("13/06/1983");
GregorianCalendar c = new GregorianCalendar();
c.setTimeInMillis(dob.getTime());
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.out.println(date2);
}
catch(DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
不幸的是,我总是将日期设为1983-06-13T00:00:00.000-04:00
。时间也包含在输出中。是否有可能只获得约会?你能帮我吗?
答案 0 :(得分:25)
您不需要指定“SimpleDateFormat”,它很简单: 您必须在不想显示的地方指定常量“DatatypeConstants.FIELD_UNDEFINED”
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
答案 1 :(得分:15)
是的,是的......
Date dob=null;
DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
dob=df.parse( "13/06/1983" );
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dob);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
这将以正确的格式提供。
答案 2 :(得分:9)
使用SimpleDateFormat更简单,没有传递所有参数:
String FORMATER = "yyyy-MM-dd'T'HH:mm:ss'Z'";
DateFormat format = new SimpleDateFormat(FORMATER);
Date date = new Date();
XMLGregorianCalendar gDateFormatted =
DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(date));
完整示例here。
注意:这仅用于删除最后两个字段:毫秒和时区,或者使用格式化程序yyyy-MM-dd
删除整个时间组件。
答案 3 :(得分:2)
实际上并没有理想的转换方法,但是我想提供几个选择。
java.time
首先,您应该使用Java.time(现代的Java日期和时间API)中的LocalDate
来解析和保存您的日期。避免使用Date
和SimpleDateFormat
,因为它们存在设计问题并且也已经过时。众所周知,后者特别麻烦。
DateTimeFormatter originalDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String dateString = "13/06/1983";
LocalDate date = LocalDate.parse(dateString, originalDateFormatter);
System.out.println(date);
输出为:
1983-06-13
您需要进一步吗? LocalDate.toString()
产生您要求的格式。
格式化和解析
假设您确实需要XMLGregorianCalendar
进行转换的第一个简单方法是:
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(date.toString());
System.out.println(xmlDate);
1983-06-13
格式化为字符串并将其解析回对我来说是一种浪费,但是正如我所说,这很容易,而且我认为结果不会像预期的那样令人惊讶。
分别通过年份,月份和月份
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);
结果与以前相同。我们需要明确表示我们不希望时区偏移(这是DatatypeConstants.FIELD_UNDEFINED
所指定的)。如果有人想知道,LocalDate
和XMLGregorianCalendar
都以人类的方式计算了数月,因此没有加法或减法1。
通过GregorianCalendar转换
我仅向您显示此选项,因为我以某种方式认为它是正式方法:将LocalDate
转换为ZonedDateTime
,然后转换为GregorianCalendar
,最后转换为XMLGregorianCalendar
。
ZonedDateTime dateTime = date.atStartOfDay(ZoneOffset.UTC);
GregorianCalendar gregCal = GregorianCalendar.from(dateTime);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(gregCal);
xmlDate.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
我喜欢转换本身,因为我们既不需要使用字符串,也不需要传递单个字段(小心以正确的顺序进行传递)。我不喜欢的是我们必须经过一天中的某个时间和时区偏移,然后再手动清除这些字段。
答案 4 :(得分:1)
对于任何格式,这都是一种简单的方法。只需将其更改为所需的格式字符串
即可XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
System.out.println(gregFmt);