Parse svn log -xml вывод даты с помощью SimpleDateFormat

Формат даты выхода xml команды svn log выглядит следующим образом.

2014-04-24T08:51:58.213757Z

Я попытался разобрать это на объект util.Date, используя SimpleDateFormat со следующей строкой.

yyyy-MM-ddTHH:mm:ss.SSSSSSZ

Полный метод

protected Date formatDate(String dateString) {
 //2014-04-24T08:51:58.213757Z

 DateFormat format = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss.SSS");
 format.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));
 Date date = null;
 int lengthToParse = "yyyy-MM-ddTHH:mm:ss.SSS".length();

 try {
 date = format.parse(dateString.substring(0, lengthToParse));
 } catch (ParseException e) {
 e.printStackTrace();
 }

 return date;
 }

Однако это дает ошибку следующим образом.

java.lang.IllegalArgumentException: Illegal pattern character 'T'
1 ответ

Вам нужно процитировать T потому что вы хотите, чтобы он соответствовал буквально. Вы также хотите, чтобы X был спецификатором формата для часового пояса, а не Z:

yyyy-MM-dd'T'HH:mm:ss.SSSSSSX

Или вы можете указать часовой пояс как UTC, а также указать Z.

yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'

Однако у вас могут быть проблемы, потому что это будет интерпретировать 213757 как количество миллисекунд, а не микросекунд.

Я не уверен, что существует чистый способ разбора микросекунд с помощью SimpleDateFormat - вам, вероятно, лучше всего разобрать подстроку:

String text = "2014-04-24T08:51:58.213567Z";
// You could just hard code the length, but this feels easier to read
String trimmed = text.substring(0, "yyyy-MM-ddTHH:mm:ss.SSS".length());
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC");
Date date = format.parse(trimmed);

Обратите внимание, что вы определенно хотите, чтобы Etc/UTC был часовым поясом, потому что вход в UTC... что означает "Z" в конце строки.

licensed under cc by-sa 3.0 with attribution.