Подтвердить что ты не робот

Альтернативы FastDateFormat для эффективного синтаксического анализа даты?

Хорошо осознавая проблемы с производительностью и потоками с помощью SimpleDateFormat, я решил пойти с FastDateFormat, пока не понял, что FastDateFormat предназначен только для форматирования, без синтаксического анализа!

Есть ли альтернатива FastDateFormat, которая готова к использованию из коробки и намного быстрее, чем SimpleDateFormat?

Я считаю, что FastDateFormat является одним из самых быстрых, поэтому все, что примерно так же быстро, будет делать.

Любопытно, любая идея, почему FastDateFormat не поддерживает синтаксический анализ? Разве это не серьезно ограничивает его использование?

4b9b3361

Ответ 1

В лучшем случае, чтобы сохранить FastDateFormat... хорошо... быстро, ограничив его только отображением.

Apache Commons DateUtils имеет функцию parseDate, но использует SimpleDateFormat внутренне.

Альтернативой является использование библиотеки JodaTime. Это полная замена для работы с объектами DateFormat, Date и Calendar.

JodaTime имеет DateTimeFormatter, который можно использовать для создания объектов DateTime (эквивалент JodaTime объектов Java Date) из строк.

Пример того, как его использовать, выглядит следующим образом:

String strInputDateTime = "2010-12-27"; // An example, this would really come from outside
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dt = fmt.parseDateTime(strInputDateTime);

Я не знаю, действительно ли это на самом деле быстрее, чем SimpleDateFormat.

Ответ 3

Нашел что-то интересное в этом случае в Android: http://andmob.wikidot.com/faq-simpletimeformat

SimpleDateFormat, первый раз, когда вы попробуйте разобрать (или, предположительно, форматирование) дата, будет загружаться во всех данные по часовому поясу для вашей локали. Это займет 2-3 секунды. это надеется, что это будет исправлено в некоторых будущей версии Android.

В промежуточный период AsyncTask для "разогрева" SimpleDateFormat в вашем процессе прежде чем он вам понадобится. Просто проанализируйте некоторые дата в AsyncTask doInBackground() заставить его загружать часовые пояса когда это не повлияет на пользователя так много. После инициализации в вашем процесс, SimpleDateFormat будет запущен быстро, пока ваш процесс не будет прекращается.

Ответ 4

С Java 8 можно использовать DateTimeFormatter вместе с API Java 8 Time API для синтаксического анализа и форматирования дат. Из документации:

Этот класс является неизменным и потокобезопасным.

Рекомендуется использовать этот класс, если это возможно, для новой работы, а не для использования SimpleDateFormat.

Ответ 5

"Проблема" с SimpleDateFormat - это не производительность, а безопасность потока.

Если у вас тысячи потоков и синхронизация не является проблемой, используйте синхронизацию (вы можете также объединить экземпляры, чтобы облегчить это)

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

Ответ 6

Вам действительно нужно быстро разобрать даты? Вы протестировали SimpleDateFormat и нашли его слишком медленным для своих нужд?

Обратите внимание, что существует множество способов кэширования медленных, не связанных с потоком экземпляров классов (например, ThreadLocal, пулы).