Строка на сегодняшний день;Формат ввода варьируется - PullRequest
0 голосов
/ 26 июня 2011

Для проекта, над которым я сейчас работаю, мне нужно конвертировать String в Date . К сожалению, дата и время не одинаковы во всех строках , которые необходимо преобразовать. В текущих значениях мы часто видим что-то вроде 2011-06-25T22: 44: 12 или 2011-06-25 22: 49: 01 (обратите внимание на T?).

Я знаю, как преобразовать String в Date , используя SimpleDateFormat , но, поскольку я не знаю, в каком формате будет ввод, это не не похоже на правильный подход. Мне было интересно, есть ли способ добавить несколько «форматов» к объекту DateFormat или, возможно, есть класс DateFormat , который может автоматически определять формат?

Другой подход, о котором я думал, - это использовать некоторые операторы if / else и регулярные выражения для String , чтобы выяснить, какой формат используется, и использовать класс SimpleDateFormat , который соответствует с этим, но я почти уверен, что должен быть более легкий путь. Есть предложения?

Ответы [ 3 ]

1 голос
/ 26 июня 2011

T внутри, потому что это стандартный формат ISO для даты http://en.wikipedia.org/wiki/ISO_8601. Помните, однако, что этот формат с 'T' является лишь одним из нескольких вариантов, которые вы можете увидеть, когда дата приходит как ISO 8601 (один изИзменения отбрасываются во время, другое с последующей спецификацией часового пояса).

Если вы знаете, что ваша дата будет соответствовать стандарту ISO 8601 (это очень часто для хорошо определенного XML - когда вы используете поля даты XSD, соответствующие ISO 8601), тогда Java SimpleDateFormat недостаточно - этоэто слишком просто ... Вы можете вместо этого вернуться к библиотеке JodaTime - Joda Time уже имеет готовый для использования форматер ISO 8601: http://joda -time.sourceforge.net / api-release / org / joda / time /format / ISODateTimeFormat.html

Отредактировано: я не буду реализовывать какие-либо сложные сопоставления регулярных выражений - это делает код трудным для поддержки и понимания в долгосрочной перспективе (особенно, если у вас может быть много источников во многих форматах)

Предложение заключается в том, чтобы выяснить, какой поставщик использует какой формат и использовать шаблон стратегии: formatter = DateFormatterStrategyChooser.getFormatter (String source).Разделяй и властвуй.

И в случае, если вы не уверены на 100%, какой источник содержит какую дату - вы все равно можете использовать UmbrellaFormatter (Collection) и последовательно проходить через каждый форматировщик, пока один из них не преуспеет. Это лучше для удобства сопровождения, чем дляопираясь на непонятные и сложные правила.

0 голосов
/ 26 июня 2011

Если у вас есть несколько вариантов, не только один с буквой 'T', а другой с пробелом, я считаю, что if / then / else с несколькими регулярными выражениями и соответствующими SimpleDateFormats - это то, что вам нужно.

0 голосов
/ 26 июня 2011

Проверьте наличие «Т», если оно присутствует, проанализируйте строку и замените ее пробелом. Теперь вы можете использовать Date Formatter для создания объекта Date.

...