Альтернативы FastDateFormat для эффективного анализа даты? - PullRequest
23 голосов
/ 27 декабря 2010

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

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

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

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

Ответы [ 6 ]

20 голосов
/ 08 апреля 2014

Обратите внимание, что начиная с commons-lang 3.2, FastDateFormat поддерживает синтаксический анализ и печать.

См .: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/FastDateFormat.html

19 голосов
/ 27 декабря 2010

В лучшем случае это 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.

9 голосов
/ 12 мая 2011

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

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

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

6 голосов
/ 04 ноября 2015

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

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

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

3 голосов
/ 27 декабря 2010

Проблема с SimpleDateFormat заключается не в производительности, а в безопасности потоков.

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

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

UPDATE

Начиная с Java 8, просто используйте DateTimeFormatter. Это неизменный, потокобезопасный, быстрый и более гибкий. (Он также предлагает полезные функции, такие как шаблоны по умолчанию для строк даты / времени ISO-8601.)

1 голос
/ 27 декабря 2010

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

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

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