Java: можно ли сравнивать даты как строки


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

6 2

6 ответов:

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

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

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

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

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

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

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

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

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

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

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