是不是有一种方便的方法从java.util.Date到XMLGregorianCalendar?
当我使用 Jackson 多态序列化时,它会生成一个带有不正确的完全限定类名的 JSON 对象。
下面的代码序列化一个 XMLGregorianCalendar。输出是:
["java.util.GregorianCalendar",-3600000]
Run Code Online (Sandbox Code Playgroud)
我期望以下内容:
["javax.xml.datatype.XMLGregorianCalendar",-3600000]
Run Code Online (Sandbox Code Playgroud)
为什么它输出 java.util.GregorianCalendar?
或者更重要的是:我该如何解决这个问题?
代码示例:
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.io.ByteArrayOutputStream;
public class JacksonGregorianProblem {
public static void main(String[] args) throws java.io.IOException, DatatypeConfigurationException {
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar();
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
mapper.writeValue(byteArrayOutputStream, xmlGregorianCalendar);
System.out.println(byteArrayOutputStream);
}
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个XMLGregorianCalendar
具有以下特征的:
所以我希望日期打印为:18:00:00Z ( XML Date )。
该元素是一个 xsd:time,我希望时间在 XML 中像这样显示。
<time>18:00:00Z</time>
Run Code Online (Sandbox Code Playgroud)
但我得到以下信息:21:00:00+0000。我在 -3 偏移处,结果是我的偏移量的计算。
为什么我的代码有问题?
protected XMLGregorianCalendar timeUTC() throws Exception {
Date date = new Date();
DateFormat df = new SimpleDateFormat("HH:mm:ssZZ");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
String dateS = df.format(date);
return DatatypeFactory.newInstance().newXMLGregorianCalendar(dateS);
}
Run Code Online (Sandbox Code Playgroud) 如何创建没有时区的XMLGregorianCalendar?无时间偏移量(0)== UTC,它在输出中输出“ Z”。我的字段的含义是隐式本地时间,在xml记录的其他位置(例如地址)指定位置。
如何创建带有未定义时区(TimeZone不确定)的XMLGregorianCalendar?
有效的XML ISO-8601公历日历格式包括:
使用 using处理Json
字符串时出现异常:XMLGregorianCalender
Gson
java.lang.RuntimeException:无法调用没有参数的 public javax.xml.datatype.XMLGregorianCalendar()
fromJson(..)
通过with反序列化的对象Gson
有一个XMLGregorianCalender
对象。
上述错误的可能解决方案是什么?
我有一个看起来像这样的日期字符串。
2017-12-06T17:39:00Z
我想要做的是将此字符串转换为 XMLGregorianCalendar 但使用相同的格式。
我现在做的是:
String choosenDate = 2017-12-06T17:39:00Z;
GregorianCalendar c = new GregorianCalendar();
DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_DATE_TIME;
TemporalAccessor accessor = timeFormatter.parse(dateChoisie);
Date date = Date.from(Instant.from(accessor));
c.setTime(date);
System.err.println("choosenDate: " + dateChoisie);
System.err.println("date : " + date);
XMLGregorianCalendar dateXMLGreg = null;
try
{
dateXMLGreg = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.err.println("dateXMLGreg: " + dateXMLGreg);
}
catch (DatatypeConfigurationException e)
{
messages.addMessage(new MessageBuilder().error().code("webservice.failure").build());
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
10:47:45,957 错误 [stderr](默认任务 47)选择日期:2017-12-06T17:39:03Z
10:47:45,957 错误 [stderr](默认任务 47)日期:2017 年 12 月 6 日星期三 18:39:03 CET
10:47:45,958 错误 [stderr](默认任务 47) dateXMLGreg:2017-12-06T18:39:03.000+01:00
那么我该怎么做才能让我的 …
我的程序需要将一个 xml 文件转换为另一个与通过我们公司程序发送发票兼容的 xml 文件。
代码的编译没有问题,而当我启动 .bat 文件时,出现此错误:
Exception in thread "main" java.lang.IllegalAccessError:
class controller.ConversionWorker (in unnamed module @0x71c8becc)
cannot access class com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl (in module java.xml)
because module java.xml does not export com.sun.org.apache.xerces.internal.jaxp.datatype to unnamed module @0x71c8becc
Run Code Online (Sandbox Code Playgroud)
这是生成异常的代码:
private XMLGregorianCalendar stringToXMLGregorian(String data, String pattern) {
Calendar date = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat(pattern);
try {
date.setTime(format.parse(data));
} catch (ParseException e) {
e.printStackTrace();
Log.debug("ERRORE DI CONVERSIONE DATA: " + data);
}
XMLGregorianCalendar result = new XMLGregorianCalendarImpl();
result.setYear(date.get(Calendar.YEAR));
result.setMonth(date.get(Calendar.MONTH) + 1); …
Run Code Online (Sandbox Code Playgroud) 当我运行下面的代码将 xml 日期转换为 java 日期时,它在本地打印不同的值(CST),在运行相同代码的服务器中打印不同的值(UTC),这可能是什么原因?我怎样才能始终以我在本地获得的 CST 格式打印此日期。我无法使用最新的 java 日期 API,而必须使用基于 XML 的日期。
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.TimeZone;
import javax.xml.datatype.DatatypeConstants;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Date;
import java.util.TimeZone;
public class Demo {
public static final TimeZone TIMEZONE = TimeZone.getTimeZone("America/Chicago");
public static Date convertDate(XMLGregorianCalendar value) {
if (value == null) {
return null;
} else {
if (value.getXMLSchemaType() == DatatypeConstants.DATE) {
return value.toGregorianCalendar().getTime();
} else {
return value.toGregorianCalendar(TIMEZONE, null, null).getTime();
}
}
}
public static void main(String[] args) { …
Run Code Online (Sandbox Code Playgroud)