Сравнение дат в Java - PullRequest
       2

Сравнение дат в Java

2 голосов
/ 29 декабря 2011

Я пытаюсь сравнить две даты с текущей датой.Кажется, не работает, когда я пытаюсь узнать, совпадает ли дата с текущей датой.Вот что я делаю в своем коде:

//BeginDate is set earlier

Date myDate= new SimpleDateFormat("dd/MM/yyyy").parse(BeginDate);
Date now = new Date();

    System.out.println("Now : " + now);
    System.out.println("myDate : " + myDate);
    System.out.println("equals : " + myDate.equals(now));
    System.out.println(myDate.compareTo(now));

И я получаю это в консоли:

Now : Thu Dec 29 00:28:45 CET 2011
myDate : Thu Dec 29 00:00:00 CET 2011
equals : false
-1

Первое сравнение должно вернуть true, а второе «0», верно?Или я что-то упустил?

Ответы [ 5 ]

5 голосов
/ 29 декабря 2011

Сравнение дат с помощью equals () или compareTo () сравнивает время (часы, минуты, секунды, миллис), а также даты. Ваш тест не пройден, потому что myDate сегодня полночь, а now немного позже.

1 голос
/ 29 декабря 2011

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

Или, если хотите, вы можете преобразовать даты в строки и выполнить сравнение:

    String beginDate = "28/12/2011";
    Calendar now = Calendar.getInstance();
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    String nowStr = df.format(new Date());
    System.out.println("equals : " + beginDate.equals(nowStr));
0 голосов
/ 07 марта 2012

Если вы собираетесь иметь дело только с датами между 1900 и 2100 годами, существует простой расчет, который даст вам количество дней с 1900 года:

public static int daysSince1900(Date date) {
    Calendar c = new GregorianCalendar();
    c.setTime(date);

    int year = c.get(Calendar.YEAR) - 1900;
    int month = c.get(Calendar.MONTH) + 1;
    int days = c.get(Calendar.DAY_OF_MONTH);

    if (month < 3) {
        month += 12;
        year--;
    }
    int yearDays = (int) (year * 365.25);
    int monthDays = (int) ((month + 1) * 30.61);

    return (yearDays + monthDays + days - 63);
}

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

ПРИМЕЧАНИЕ: В вышеприведенном методе должен быть добавлен код, чтобы проверить, находятся ли даты за пределамидопустимый диапазон (1/1/1900 - 31/12/2099) и сгенерируйте исключение IllegalArgumentException.

И не спрашивайте меня, откуда пришли эти вычисления, потому что мы использовали их с начала 90-х годов.

0 голосов
/ 04 января 2012

Дата объект в Java - это не что иное, как число, представляющее миллисекунды с 1 января 1970 года, 00:00:00 по Гринвичу.У него нет атрибута, который называется день, дата, месяц, год и т. Д. Это потому, что дата, месяц, год варьируются в зависимости от типа календаря и часового пояса.Эти атрибуты принадлежат Calendar instance.

Итак, если у вас есть 2 Date объектов и вы хотите сравнить день месяца, месяц и год, то вы должны создать соответствующий Calendar instance и сравните их отдельно.

// Parse begin date
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date beginDate = dateFormat.parse(beginDateAsString);
// Create calendar instances
Calendar beginDateCalendar = Calendar.getInstance();
beginDateCalendar.setTime(beginDate);
Calendar todayCalendar = Calendar.getInstance();
// Check Equals
boolean dayEquals = todayCalendar.get(Calendar.DAY_OF_MONTH) == beginDateCalendar
        .get(Calendar.DAY_OF_MONTH);
boolean monthEquals = todayCalendar.get(Calendar.MONTH) == beginDateCalendar
        .get(Calendar.MONTH);
boolean yearEquals = todayCalendar.get(Calendar.YEAR) == beginDateCalendar
        .get(Calendar.YEAR);
// Print Equals
System.out.println(dayEquals && monthEquals && yearEquals);

Вышеприведенный код неудобен для текущей проблемы, но объясняет, как операции с датами должны выполняться в JAVA.

Если вы просто хотите решить проблему равенства, о которой вы упомянули, то кода, приведенного ниже, будет достаточно:

String todayAsString = (new SimpleDateFormat("dd/MM/yyyy")).format(new Date());
System.out.println(beginDateAsString.equals(todayAsString));
0 голосов
/ 29 декабря 2011

Вы указываете миллисекунды при создании дат? Если да, не надо. Поэтому при создании дат раньше укажите только День, Час и т. Д., А не секунды / миллисекунды.

И, соответственно, измените SimpleDateFormat. Это "должно" работать.

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