невозможно получить разницу дней между двумя датами в Java - PullRequest
0 голосов
/ 13 января 2012

Я хочу рассчитать разницу дней между двумя датами. Мой код работает нормально, когда год даты не меняется, но когда я вычисляю разницу между двумя датами следующим образом: (с 13.01.2012 по 13.12.2011), он дает отрицательное значение. Это также дает неправильные значения разницы, когда я вычисляю разницу между сегодняшней датой и будущей датой. Пожалуйста, помогите мне. Заранее спасибо. Вот мой код:

//getting values from text box
String fromtext = from.getText().toString();
String totext = to.getText().toString();
//sdf if a simple date formatter
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
Date fromdate = (Date) sdf.parse(fromtext);
Date todate = (Date) sdf.parse(totext);

Calendar fromcal = Calendar.getInstance();
Calendar tocal = Calendar.getInstance();


    fromcal.setTime(fromdate);
    tocal.setTime(todate);// setting to date


    int reportDays=(int)(todate.getTime()-fromdate.getTime())/(3600*24*1000);

подскажите, пожалуйста, как лучше всего рассчитать разницу в днях.

Ответы [ 9 ]

6 голосов
/ 13 января 2012

Ввод дат: 13/01/2012, 13/12/2011

формат выглядит как dd/MM/yyyy, и вы используете неправильный (т.е. MM/dd/yyyy)

1 голос
/ 25 марта 2017

tl; dr

ChronoUnit.DAYS.between(
    LocalDate.parse( "13/01/2012" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
    LocalDate.parse( "13/12/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) )
)

Использование java.time

Гораздо проще с современными классами java.time, которые вытесняют старые классные классы даты и времени, такие как DateCalendar.

(13/01/2012 to 13/12/2011),

Класс LocalDate представляет значение только для даты без времени суток и без часового пояса.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate start = LocalDate.parse( "13/01/2012" , f );
LocalDate stop = LocalDate.parse( "13/12/2011" , f );

Используйте ChronoUnit для расчета прошедших дней.

long days = ChronoUnit.DAYS.between( start , stop );

Конечно, число дней при обращении во времени отрицательно.Обратите внимание, что дата остановки раньше, чем дата начала.

Часовой пояс имеет решающее значение при определении даты.В любой момент времени дата меняется по всему земному шару в зависимости от зоны.Например, через несколько минут после полуночи в Париж Франция - это новый день, в то время как "вчера" в Монреаль Квебек .

Укажите правильный часовой поясимя в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland.Никогда не используйте 3-4-буквенное сокращение, например EST или IST, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

Вы можете снова использовать ChronoUnit для подсчета дней в будущем.

long days = ChronoUnit.DAYS.between( today , today.plusMonths( 7 ) );

О java.time

java.time Framework встроен в Java 8 и более поздние версии.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Где получить классы java.time?

  • Java SE 8 и SE 9 и более поздних версий
    • Встроенный,
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android

Проект ThreeTen-Extra расширяет java.timeс дополнительными занятиями.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval, YearWeek, YearQuarter и more .

1 голос
/ 13 января 2012

В дополнение к проблеме формата, о которой уже упоминалось, у вас, скорее всего, переполнение.Попробуйте это:

int reportDays=(int)((todate.getTime()-fromdate.getTime())/(3600*24*1000));
1 голос
/ 13 января 2012

Я думаю, вам стоит попробовать поискать в Google ....

0 голосов
/ 14 июня 2019

Я бы сделал это так!

package javaapplication2;
//@author Ibrahim Yesilay
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class JavaApplication2 {  


    public static void main(String[] args) throws ParseException {



    Scanner scan = new Scanner(System.in);        
        System.out.println("First dates Day :");
        int d = scan.nextInt();
        System.out.println("First dates Mounth :");
        int m = scan.nextInt();
        System.out.println("First dates Year :");
        int y = scan.nextInt();
        String date;
        date = Integer.toString(d) + "/" + Integer.toString(m) + "/" + Integer.toString(y);  
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date firstdate = null;
        firstdate = dateFormat.parse(date);
        System.out.println(dateFormat.format(firstdate)); 

        System.out.println("Second dates Day :");
        d = scan.nextInt();
        System.out.println("Second dates Month :");
        m = scan.nextInt();
        System.out.println("Second dates Year :");
        y = scan.nextInt();
        date = Integer.toString(d) + "/" + Integer.toString(m) + "/" + Integer.toString(y);  
        Date seconddate = null;
        seconddate = dateFormat.parse(date);
        System.out.println(dateFormat.format(seconddate)); 

        if (seconddate.getTime() > firstdate.getTime()) {
            long sonuc = (long)(seconddate.getTime()- firstdate.getTime())/(3600*24*1000);
            System.out.println("" + sonuc);
        } else if (firstdate.getTime() > seconddate.getTime()) {
            long sonuc = (long)(firstdate.getTime()- seconddate.getTime())/(3600*24*1000);
            System.out.println("" + sonuc);
        } else {
            System.out.println("The dates are equal!");
        }

    }   
}
0 голосов
/ 07 марта 2012

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

Если вы собираетесь работать только с датами между 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 голосов
/ 13 января 2012

Вот простой маленький класс, который я написал для этой цели:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DifferenceInDays
{
    public int dateOffset(String incomingDate) throws ParseException
    {
        // parse dates
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date date = (Date) formatter.parse(incomingDate);

        // convert to milliseconds
        long millisecs = date.getTime();

        // convert to days
        int offsetInDays = (int) Math.abs(millisecs / (1000 * 60 * 60 * 24));
        return offsetInDays;
    }
}

Он обрабатывает отрицательные смещения, используя метод абсолютного значения.

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

проверьте этот код:

import java.util.Calendar;

public class DateDifferent{  
  public static void main(String[] args){
  Calendar calendar1 = Calendar.getInstance();
  Calendar calendar2 = Calendar.getInstance();
  calendar1.set(2007, 01, 10);
  calendar2.set(2007, 07, 01);
  long milliseconds1 = calendar1.getTimeInMillis();
  long milliseconds2 = calendar2.getTimeInMillis();
  long diff = milliseconds2 - milliseconds1;
  long diffSeconds = diff / 1000;
  long diffMinutes = diff / (60 * 1000);
  long diffHours = diff / (60 * 60 * 1000);
  long diffDays = diff / (24 * 60 * 60 * 1000);
  System.out.println("\nThe Date Different Example");
  System.out.println("Time in milliseconds: " + diff + " milliseconds.");
  System.out.println("Time in seconds: " + diffSeconds + " seconds.");
  System.out.println("Time in minutes: " + diffMinutes + " minutes.");
  System.out.println("Time in hours: " + diffHours + " hours.");
  System.out.println("Time in days: " + diffDays + " days.");
  }
}
0 голосов
/ 13 января 2012

Использование joda time было бы самым простым способом.

...