Ява, получи дни между двумя датами - PullRequest
5 голосов
/ 02 ноября 2011

В java я хочу получить количество дней между двумя датами, исключая эти две даты.

Например:

Если первая дата = 11 November 2011 и вторая дата = 13 November 2011 тогда это должно быть 1.

Это код, который я использую, но он не работает (secondDate и firstDate являются Calendar объектами):

long diff=secondDate.getTimeInMillis()-firstDate.getTimeInMillis();
float day_count=(float)diff / (24 * 60 * 60 * 1000);
daysCount.setText((int)day_count+"");                    

Я даже пытался округлить результаты, но это не помогло.

Как узнать количество дней между датами в java, исключая сами дни?

Ответы [ 5 ]

10 голосов
/ 02 ноября 2011

Я только что протестировал на SDK 8 (Android 2.2) следующий фрагмент кода:

Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

date1.clear();
date1.set(
   datePicker1.getYear(),
   datePicker1.getMonth(),
   datePicker1.getDayOfMonth());
date2.clear();
date2.set(
   datePicker2.getYear(),
   datePicker2.getMonth(),
   datePicker2.getDayOfMonth());

long diff = date2.getTimeInMillis() - date1.getTimeInMillis();

float dayCount = (float) diff / (24 * 60 * 60 * 1000);

textView.setText(Long.toString(diff) + " " + (int) dayCount);

работает отлично и в обоих случаях (10 ноября 2011 года - 8 ноября 2011 года) и (13 ноября 2011 года - 11 ноября 2011 года) дает dayCount = 2,0

7 голосов
/ 23 апреля 2013

Получить дни между java.util.Dates, игнорируя переход на летнее время

Быстрый и грязный хак:

public int get_days_between_dates(Date date1, Date date2)
{       
    //if date2 is more in the future than date1 then the result will be negative
    //if date1 is more in the future than date2 then the result will be positive.

    return (int)((date2.getTime() - date1.getTime()) / (1000*60*60*24l));
}

Эта функция будет работать в 99,99% случаев, за исключением случаев, когда она неожиданно вас удивит в крайних случаях в течение високосных секунд, перехода на летнее время, смены часового пояса, високосных лет и т. П. Если вы согласны с тем, что время от времени расчет отключается на 1 (или 2) часа, этого будет достаточно.

Получите дни между датами с учетом дополнительных секунд, летнего времени, часовых поясов и т. Д.

Если вы задаете этот вопрос, вам нужно дать себе пощечину. Что означает, что две даты должны быть на расстоянии как минимум 1 день? Это очень запутанно. Что если одна дата - полночь в одном часовом поясе, а другая - 1:00 в другом часовом поясе? В зависимости от того, как вы его интерпретируете, ответ будет 1 и 0.

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

И вы думаете, что справитесь с этим? В мире существует несколько запаздывающих Календарных систем, которые постоянно меняются в зависимости от сезона сбора урожая и установленных политических правителей. Если вы хотите перевести свое время в UTC, java.util.Date в самый неподходящий момент вас подведет.

Если вам нужно рассчитать дни между датами, и очень важно, чтобы все получилось правильно, вам нужно получить внешнюю библиотеку Joda Time: (Они позаботились обо всех деталях для вас, чтобы вы могли оставаться в блаженстве не подозревая о них): http://joda -time.sourceforge.net / index.html

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);
    if (year < 1900 || year > 2099) {
        throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099");
    }
    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 года и рассчитываете разницу.Наш метод daysBetween выглядит следующим образом:

public static Integer getDaysBetween(Date date1, Date date2) {
    if (date1 == null || date2 == null) {
        return null;
    }

    int days1 = daysSince1900(date1);
    int days2 = daysSince1900(date2);

    if (days1 < days2) {
        return days2 - days1;
    } else {
        return days1 - days2;
    }
}

В вашем случае вам необходимо вычесть дополнительный день (если дни не равны).

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

0 голосов
/ 02 ноября 2011
  1. Не используйте числа с плавающей запятой для целочисленных вычислений.

  2. Вы уверены, что у вас есть дни? Точность типа Date составляет миллисекунды. Итак, первое, что вам нужно сделать, это округлить дату до того, что не имеет часов. Пример: от 23:30 2011-11-01 до 00:30 2011-11-02 всего один час, но две даты в разные дни.

0 голосов
/ 02 ноября 2011

У меня есть два предложения:

  1. Убедитесь, что ваш float day_count рассчитан правильно

    float day_count = ((float) diff) / (24f * 60f * 60f * 1000f);

  2. Если ошибка округления, попробуйте использовать floor method

    daysCount.setText ("" + (int) Math.floor (day_count));

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