2015-06-18 1 views
5

ли, как показано ниже,Java8 LocalDateTime в XMLGregorianCalender Удалить "+05: 30" Порция

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); 

Я хочу вывод как 2015-06-18 11:59:15:135, но когда я установить xcal к в XML-тег, который принимает XMLGregorianCalender, он показывает 2015-06-18T11:59:15.135+05:30.

Как я могу удалить часть +05:30?

+1

Вы пробовали 'DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.toString())' используя лексическое представление в ISO-8601? –

+0

@Meno Hochschild: Нет, я не сделал. Но сейчас он работает, и все работает отлично. Большое спасибо. Не могли бы вы послать этот ответ, чтобы я мог отметить его как решаемый и выбрать его как решение. – Raj

ответ

7

Используйте этот код:

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‌​); 

Объяснение:

код делает использование данного factory method ожидает лексикографическое представление местной временной метки в ISO-8601-формате. А так как LocalDateTime не ссылается на какой-либо часовой пояс, его вывод через toString() не может содержать смещение часового пояса. Результат: XMLGregorianCalendar считает смещение временной зоны «не установленным».

Исправление:

Исходный код не особенно беспокоиться о ISO-варианте форматированного вывода currentUTCTime.toString(). Однако, java.time-API производит выход без секунд или наносекунд, если эти части равны нулю. Это совершенно законно в ISO, но W3C-консорциум сделал вторую часть не факультативной. И класс XMLGregorianCalendar внимательно следит за этой отклоняющейся спецификацией. Поэтому показанный взломать выше, используя простую конкатенацию строк в этом специальном случае края. Большое спасибо комментарию @ Dave. Кстати, использование currentUTCTime.format(DateTimeFormatter.ISO_DATE_TIME), как предлагается в этом комментарии, также возможно (вместо показанного взлома).

+1

Это не работает. То, что вы хотите, это DatatypeFactory.newInstance(). NewXMLGregorianCalendar (currentUTCTime.format (DateTimeFormatter.ISO_DATE_TIME)). XMLGregorianCalendar.newXMLGregorianCalendar (String) требует, чтобы в его аргументе были заполнены секунды. Если секунды == 0 LocalDateTime.toString() будет пропускать секунды и предыдущие: разделитель полностью заставляет метод фабрики календаря выбрасывать исключение IllegalArgumentException. – Dave

+0

@Dave Теперь изменил мой ответ. –

+0

Лучше использовать форматтер, чем фраза if if – JodaStephen