Java: нормально ли сравнивать даты как строки - PullRequest
2 голосов
/ 07 марта 2012

Из внешнего сервиса я получаю объекты с полями Date+Time как String в формате 2012-03-07 12:12:23.547, и мне нужно сравнить эти поля, чтобы получить правильный порядок объектов. Мне хорошо известно, что я могу создавать Date объекты, например, с помощью SimpleDateFormat ("гггг-ММ-дд ЧЧ: мм: сс.ССС") и сравните два Date для достижения этой цели, но мой вопрос заключается в том, могу ли я рассчитывать на правильный порядок сортировки, если сравниваю их как строки, такие как String.compareTo(String)? Некоторое легкое тестирование создает у меня впечатление, что это работает, но мне интересно, знает ли кто-нибудь о каких-либо сценариях, где это НЕ даст мне правильный результат? Кроме того, есть ли какие-либо соображения по поводу производительности, плюсы или минусы, при сравнении String анализа паролей с датами для сравнения?

Ответы [ 6 ]

5 голосов
/ 07 марта 2012

Предполагая, что часы представлены в 24-часовом формате, тогда да, это сортируемый формат даты / времени - и одним из его известных преимуществ является то, что вы можете сортировать данные без фактического анализа.

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

Если вам понадобится значение в качестве даты / времени позже, тогда я сначала проанализирую его, а затем сравню. Но если вам нужно только с точки зрения упорядочения, сравнение строк может быть быстрее, чем анализировать все. Конечно, стоит попробовать сравнительный анализ, особенно потому, что сравнение двух строк в один и тот же день потребует проверки нескольких символов, тогда как, если вы проанализировали его один раз, вы, вероятно, просто сравните значения long.

2 голосов
/ 07 марта 2012

Работает при условии

  • Вы упорядочиваете поля от наиболее значимых до наименее значимых.
  • Вы используете числовые поля (не январь / февраль), и они имеют одинаковую ширину. например 2:15 после 12:15, но 02:15 раньше, чем ожидалось. Примечание: в течение лет после 9999 и до 0001 это не будет работать.
  • Вы принимаете, что недопустимые даты могут быть не обнаружены.
2 голосов
/ 07 марта 2012

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

Сравнение их с датами сделает ваш код более понятным и будет означать, что в будущем вам будет проще изменить формат даты (на тот, который не сортируется как строка).

2 голосов
/ 07 марта 2012

Нет, лучшим подходом будет анализ строки в объекте даты, а затем сравнение с другим объектом даты.

1 голос
/ 07 марта 2012

Я думаю, что Дата сравнивается или может сравниваться через миллисекунды (длинные), что быстрее. Это, вероятно, более безопасный способ, вам не нужно думать о том, когда сравнение строк не подходит.

1 голос
/ 07 марта 2012

Используйте тип, который он представляет - в данном случае это дата, поэтому используйте дату.Даты можно легко отсортировать в хронологическом порядке, добавив их в коллекцию и выполнив Collections.sort (даты) по датам.

См. http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

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