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 ответов:
Предполагая, что часы находятся в 24-часовом формате, тогда да, это сортируемый формат даты/времени - и одно из его хорошо известных преимуществ заключается в том, что вы можете сортировать без фактического разбора.
Один недостаток: если вы получите плохие данные, вы не заметите их - вы просто аккуратно отсортируете их в "правильном" месте, игнорируя тот факт, что вам дали (скажем) 30 февраля.
Если вам нужно значение в качестве даты/времени позже, то я бы сначала проанализировал его, а затем сравнил. Но если вам нужно только это с точки зрения упорядочения, сравнение строк может быть быстрее, чем разбор всего. Конечно, стоит провести сравнительный анализ... тем более, что сравнение двух строк в один и тот же день потребует нескольких символов-стоит проверить, тогда как если вы разбирали его один раз, то, вероятно, можете просто сравнить значения
long
.
Я бы не беспокоился о производительности, если бы у вас не было какой-то причины думать, что этот код будет узким местом (вызываемым много раз в циклах), и даже тогда я бы подождал, пока вы не сможете сделать какое-то конкретное тестирование производительности.
Сравнение их в виде дат сделает ваш код понятнее и будет означать, что вы сможете легче изменить формат даты в будущем (на что-то, что не сортируется как строка).
Он работает при условии
- вы упорядочиваете поля от наиболее значимых до наименее значимых.
- вы используете числовые поля (не Jan/Feb), и они имеют одинаковую ширину. например, 2: 15-после 12: 15, а 02: 15-до, как и ожидалось. Примечание: для лет после 9999 и до 0001 это не будет работать.
- Вы признаете, что недопустимые даты не могут быть обнаружены.
Используйте тип, который он представляет - в этом случае это дата, поэтому используйте дату. Даты можно легко отсортировать в хронологическом порядке, добавив их в коллекцию и делая коллекции.сортировка (дат) по датам.
См. http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html