将 tz-offset 内不带冒号的 ISO 日期字符串转换为 XMLGregorianCalendar
Convert ISO date String WITHOUT colon inside tz-offset to XMLGregorianCalendar
输入日期字符串:"2016-02-06T00:00:00.000+0100"
(+0100 中没有冒号)
有没有更好的方法。想知道这是不是矫枉过正。
public static XMLGregorianCalendar convertStringToXMLGregorianCalendar(final String dateStrInXMLGregorianCalendar) {
try {
DateTime dateTime = ISODateTimeFormat.dateTime().parseDateTime(dateStrInXMLGregorianCalendar);
GregorianCalendar gregCal = new GregorianCalendar(dateTime.getZone().toTimeZone());
gregCal.setTimeInMillis(dateTime.getMillis());
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregCal);
} catch (Exception e) {
throw new RuntimeException(String.format("Exception while converting %s to XMLGregorianCalendar!", dateStrInXMLGregorianCalendar), e);
}
}
也许这个解决方案只使用两个 API(都在 Java-8 平台上可用)并且避免了 Joda-Time
以及 GregorianCalendar
:
String input = "2016-02-06T00:00:00.000+0100";
OffsetDateTime odt =
OffsetDateTime.parse(
input,
DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX"));
int year = odt.getYear();
int month = odt.getMonthValue();
int day = odt.getDayOfMonth();
int hour = odt.getHour();
int minute = odt.getMinute();
int second = odt.getSecond();
int millisecond = odt.getNano() / 1_000_000;
int timezone = odt.getOffset().getTotalSeconds() / 60;
XMLGregorianCalendar xmlcal =
DatatypeFactory.newInstance().newXMLGregorianCalendar(
year,
month,
day,
hour,
minute,
second,
millisecond,
timezone
);
System.out.println(xmlcal); // 2016-02-06T00:00:00.000+01:00
更多行代码,但遗漏了两个 API,这对我来说似乎更可靠、性能更好。例如,如果年份数字在 1582 之前,您的辅助方法肯定是不够的,因为 XML-Schema 需要 proleptic gregorian calendar 而您的代码不尊重这个微妙的细节。
输入日期字符串:"2016-02-06T00:00:00.000+0100"
(+0100 中没有冒号)
有没有更好的方法。想知道这是不是矫枉过正。
public static XMLGregorianCalendar convertStringToXMLGregorianCalendar(final String dateStrInXMLGregorianCalendar) {
try {
DateTime dateTime = ISODateTimeFormat.dateTime().parseDateTime(dateStrInXMLGregorianCalendar);
GregorianCalendar gregCal = new GregorianCalendar(dateTime.getZone().toTimeZone());
gregCal.setTimeInMillis(dateTime.getMillis());
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gregCal);
} catch (Exception e) {
throw new RuntimeException(String.format("Exception while converting %s to XMLGregorianCalendar!", dateStrInXMLGregorianCalendar), e);
}
}
也许这个解决方案只使用两个 API(都在 Java-8 平台上可用)并且避免了 Joda-Time
以及 GregorianCalendar
:
String input = "2016-02-06T00:00:00.000+0100";
OffsetDateTime odt =
OffsetDateTime.parse(
input,
DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX"));
int year = odt.getYear();
int month = odt.getMonthValue();
int day = odt.getDayOfMonth();
int hour = odt.getHour();
int minute = odt.getMinute();
int second = odt.getSecond();
int millisecond = odt.getNano() / 1_000_000;
int timezone = odt.getOffset().getTotalSeconds() / 60;
XMLGregorianCalendar xmlcal =
DatatypeFactory.newInstance().newXMLGregorianCalendar(
year,
month,
day,
hour,
minute,
second,
millisecond,
timezone
);
System.out.println(xmlcal); // 2016-02-06T00:00:00.000+01:00
更多行代码,但遗漏了两个 API,这对我来说似乎更可靠、性能更好。例如,如果年份数字在 1582 之前,您的辅助方法肯定是不够的,因为 XML-Schema 需要 proleptic gregorian calendar 而您的代码不尊重这个微妙的细节。