Сравнить даты в формате String - программирование
Подтвердить что ты не робот

Сравнить даты в формате String

Я получаю две даты как значения String, и я хотел проверить время начала раньше, чем время окончания. Я сравниваю их, так как он не преобразовывает их на сегодняшний день, используя SimpleDateFormat, например:

String startTime = "2013-01-02 14:25:56";
String endTime   = "2013-01-02 14:30:56";

if(endTime.compareTo(startTime) > 0){
    System.out.println("End time is greater than start time");
}

Действительно ли нужно преобразовать их на сегодняшний день и сравнить? Я пропущу что-нибудь? Я поступаю правильно?

4b9b3361

Ответ 1

Действительно ли необходимо преобразовать их на дату и сравнить?

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

Я пропущу что-нибудь?

Вы теряете гибкость

Я поступаю правильно?

Это зависит от точки зрения. Я использую нечто подобное в специализированном поиске (только по соображениям производительности). Обычно я конвертирую в Date и сравниваю эти объекты.

Ответ 2

То, что вам не хватит, - это проверка, если даты на самом деле хорошо отформатированы.

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

Например, если одна из двух дат будет отформатирована как 2013.01.02 14:30:56 или даже включила неформатированную дату, такую ​​как yesterday, тогда ваш код молча примет некоторый порядок (который, скорее всего, имеет мало общего с фактическим порядок) и продолжить. Он должен сообщить пользователю (или файлу журнала...), что некоторое ожидание не было выполнено.

Ответ 3

Это не хорошая практика и запах кода.

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

Вы не хотите сравнивать два String s, вы хотите сравнить 2 Date - так просто сделайте это, сравните два объекта Date.

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

Ответ 4

Вы можете сравнить время даты без правильного его анализа, если и только если выполнены эти 3 условия:

  • Время даты всегда в одном формате:

    • Одинаковое количество полей
    • Поля должны быть чисто числовыми. (Сравнение строк: Jan > April, Wed > Thu).
    • Размеры полей фиксированы (при необходимости добавляется 0). Например, никакое правильное заполнение не приведет к 10:01 < 1:01 (: имеет больший код ASCII, чем цифры).
    • Нечисловые части (включая разделители) должны быть одинаковыми вплоть до интервала.
  • Поля упорядочены в порядке убывания по размеру блока (больший блок справа и меньший блок слева). Например: YEAR-MONTH-DAY HOUR:MINUTE:SECOND.MILISECOND

  • Они должны находиться в одном и том же часовом поясе. Информация о часовом поясе, если она есть, должна иметь одинаковую презентацию (SGT и UTC+8 в настоящее время эквивалентны, но сравнение строк не знает об этом). Обратите внимание, что вышеупомянутое неоднозначное условие "того же часового пояса" достаточно для сравнения одинакового, но для сравнения большего/меньшего, не должно быть изменений в часовом поясе между двумя сопоставимыми датами.

Ответ 5

как насчет

  "999-01-01 00:00:00"

"10000-01-01 00:00:00"

Ответ 6

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

Ответ 7

ваш подход хорош, потому что yyyy-mm-dd hh: ii: ss можно сравнить как строку и получить правильные результаты, другие форматы дат не пройдут

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

Как сравнить даты на Java?

и вы должны просто анализировать свои строки и создавать объекты Date или Calendar, в зависимости от того, что вы хотите сделать, ниже - это то, что я считаю полезным

http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

Ответ 8

Да, лучше преобразовать String в Date и сравнить.

  • Это гарантирует, что они действительно действительные даты, поэтому нет 20-20-2012.
  • Как только преобразование завершено, остается только одно сравнение чисел.
  • Это позволяет обеспечить большую гибкость при сравнении дат разных форматов.
  • Альтернативой является написание кода, который анализирует каждое число и сравнивает его с другим, что равнозначно работе.

Ответ 9

Мои даты взяты из строкового источника и всегда имеют формат ГГГГ-ММ-ДД, без информации о часовом поясе или других сложностей. Таким образом, при сравнении длинного списка дат проще и эффективнее сравнивать их как строки, чем сначала преобразовывать их в объекты дат.

Это никогда не было проблемой, пока я не сделал эту ошибку в своем коде:

boolean past = (dateStart.compareTo(now) == -1);

Это дало некоторые неправильные результаты, потому что CompareTo не только возвращает значения как -1, 0 или 1. Это было простое исправление:

boolean past = (dateStart.compareTo(now) < 0);

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

Ответ 10

Java или нет, вы должны сначала задать эти вопросы:

  • Вам нужно сравнить время или просто дни?
  • Вам нужно проверить TimeZone, или все пользователи находятся в одном часовом поясе (или вам все равно)

Если вам нужно сравнить дни, то строка в формате "ГГГГ-ММ-дд" просто идеальна и эффективна:

'2018-01-23' < '2018-03-21'. Всегда на любом языке.

Со временем и без часового пояса, сохранение времени в базе данных как "ГГГГ-ММ-дд ЧЧ: мм: сс" также хорошо.

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

(Используется по лицензии CC BY-NC 2.5 от http://xkcd.com/1179/.)