Java8 LocalDateTime to XMLGregorianCalender Remove "+05:30" Portion

10,733

Use this code:

LocalDateTime currentUTCTime = LocalDateTime.now(); // using system timezone
String iso = currentUTCTime.toString();
if (currentUTCTime.getSecond() == 0 && currentUTCTime.getNano() == 0) {
    iso += ":00"; // necessary hack because the second part is not optional in XML
}
XMLGregorianCalendar xml =
  DatatypeFactory.newInstance().newXMLGregorianCalendar(iso‌​);

Explanation:

The code makes use of the given factory method expecting a lexicographical representation of a local timestamp in ISO-8601-format. And since a LocalDateTime does not refer to any timezone, its output via toString() cannot contain a timezone offset. Result: XMLGregorianCalendar considers the timezone offset as "not set".

Correction:

The original code did not especially bother about the ISO-variant of formatted output of currentUTCTime.toString(). However, the java.time-API produces an output without seconds or nanoseconds if those parts are equal to zero. This is perfectly legal in ISO, but the W3C-consortium has made the second part non-optional. And the class XMLGregorianCalendar closely follows this deviating spec. Therefore the shown hack above using simple string concatenation in this special edge case. Thanks a lot to @Dave's comment. By the way, using currentUTCTime.format(DateTimeFormatter.ISO_DATE_TIME) as suggested in this comment is also possible (instead of the shown hack).

Share:
10,733
Rajkishan Swami
Author by

Rajkishan Swami

Developer Under Construction :)

Updated on September 15, 2022

Comments

  • Rajkishan Swami
    Rajkishan Swami over 1 year

    Did like below,

    LocalDateTime currentUTCTime = LocalDateTime.now(ZoneId.of("UTC"));
    String reqPattern = currentUTCTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss:SSS"));
    System.out.println("Required pattern: " + reqPattern);
    GregorianCalendar calendar = GregorianCalendar.from(currentUTCTime.atZone(ZoneId.systemDefault()));
    XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
    System.out.println("But Showing As :" + xcal);
    

    I want the output as 2015-06-18 11:59:15:135, but when i set the xcal to a XML tag which takes XMLGregorianCalender, it shows like 2015-06-18T11:59:15.135+05:30.

    How can i remove the +05:30 portion?

    • Meno Hochschild
      Meno Hochschild almost 9 years
      Have you tried DatatypeFactory.newInstance().newXMLGregorianCalendar(curren‌​tUTCTime.toString()) using the lexical representation in ISO-8601?