Разбор строки даты с использованием java.text.SimpleDateFormat

У меня есть странная проблема, мне нужно проанализировать строку даты, которая выглядит как 1997-02-14T00:00:00.0000000+05:30. Странная вещь о строке даты - это информация о часовом поясе. Это +05:30 вместо обычного +0530.

У меня есть строка основного формата, yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ, которая работала бы как шарм, если бы не информация TZ.

Может ли кто-нибудь предложить решение этой проблемы? Есть ли какая-то форматная строка, которая может обрабатывать такую ​​информацию TZ?

Спасибо заранее.

Ответ 1

Не можете ли вы предварительно обработать регулярное выражение и заменить часовой пояс, например.

String dateAndTime = ...
String preprocessed = dateAndTime.replace("([+-])(\\d\\d):(\\d\\d)$", "$1$2$3");
// Go on with your life 

Ответ 2

Я рассмотрел эту проблему самостоятельно несколько месяцев назад. Если я правильно помню, SimpleDateFormat недостаточно гибкий, чтобы принимать другие форматы часовых поясов (мой был +530). То, что я сделал, было простым шагом предварительной обработки - т.е. Попытаться удалить двоеточие перед передачей String в SimpleDateFormat.

Ответ 3

SimpleDateFormat должен принять это. Из документ:

Для синтаксического анализа общие часовые пояса также принимается.

и эти указаны как:

GMTOffsetTimeZone:
             GMT Sign Hours : Minutes

который выглядит так, как вы?

Если это не удастся, тогда Joda DateTimeFormat утверждает, что это нужно. У меня возникнет соблазн использовать Joda независимо от целого ряда причин (более последовательный и простой API, безопасность потоков для форматировщиков/парсеров и т.д.).

Ответ 4

Это случайная строка даты, которая поступает из XML файла (формат ISO8601)? К сожалению, нет (простого) способа проанализировать это с помощью SimpleDateFormat, в точности из-за ":" в части часового пояса, в которой SimpleDateFormat не имеет никакого способа справиться правильно.

Посмотрите мой ответ в этом другом вопросе о том, как разбирать строки XML datetime.

Ответ 5

Конечно, всегда есть взлома предварительной обработки вашей строки.

Если никто не найдет лучшего ответа, это уже будет что-то. Вы можете инкапсулировать его в методе с комментарием, чтобы объяснить хак.

Ответ 7

Я думаю, что он должен использовать метод replaceAll для String для regular expression.

String dateAndTime = ...
String preprocessed = dateAndTime.replaceAll("(GMT)([+-])(\\d\\d):(\\d\\d)", "$2$3$4");