Calcolo dei giorni tra due date con Java

Voglio un programma Java che calcoli i giorni tra due date.

  1. Digitare la prima data (notazione tedesca, con spazi bianchi: “gg mm aaaa”)
  2. Digita la seconda data.
  3. Il programma dovrebbe calcolare il numero di giorni tra le due date.

Come posso includere gli anni bisestili e l’estate?

Il mio codice:

import java.util.Calendar; import java.util.Date; import java.util.Scanner; public class NewDateDifference { public static void main(String[] args) { System.out.print("Insert first date: "); Scanner s = new Scanner(System.in); String[] eingabe1 = new String[3]; while (s.hasNext()) { int i = 0; insert1[i] = s.next(); if (!s.hasNext()) { s.close(); break; } i++; } System.out.print("Insert second date: "); Scanner t = new Scanner(System.in); String[] insert2 = new String[3]; while (t.hasNext()) { int i = 0; insert2[i] = t.next(); if (!t.hasNext()) { t.close(); break; } i++; } Calendar cal = Calendar.getInstance(); cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert1[0])); cal.set(Calendar.MONTH, Integer.parseInt(insert1[1])); cal.set(Calendar.YEAR, Integer.parseInt(insert1[2])); Date firstDate = cal.getTime(); cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(insert2[0])); cal.set(Calendar.MONTH, Integer.parseInt(insert2[1])); cal.set(Calendar.YEAR, Integer.parseInt(insert2[2])); Date secondDate = cal.getTime(); long diff = secondDate.getTime() - firstDate.getTime(); System.out.println ("Days: " + diff / 1000 / 60 / 60 / 24); } } 

    Stai facendo alcune conversioni con le tue stringhe che non sono necessarie. C’è una class SimpleDateFormat per questo – prova questo:

     SimpleDateFormat myFormat = new SimpleDateFormat("dd MM yyyy"); String inputString1 = "23 01 1997"; String inputString2 = "27 04 1997"; try { Date date1 = myFormat.parse(inputString1); Date date2 = myFormat.parse(inputString2); long diff = date2.getTime() - date1.getTime(); System.out.println ("Days: " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS)); } catch (ParseException e) { e.printStackTrace(); } 

    EDIT: Poiché ci sono state alcune discussioni sulla correttezza di questo codice: si occupa davvero degli anni bisestili. Tuttavia, la funzione TimeUnit.DAYS.convert perde precisione poiché i millisecondi vengono convertiti in giorni (consultare il documento collegato per maggiori informazioni). Se questo è un problema, diff può anche essere convertito a mano:

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

    Si noti che questo è un valore float , non necessariamente un int .

    Modo più semplice:

     public static long getDifferenceDays(Date d1, Date d2) { long diff = d2.getTime() - d1.getTime(); return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS); } 

    La maggior parte / tutte le risposte hanno causato problemi per noi quando è arrivata l’ora legale. Ecco la nostra soluzione di lavoro per tutte le date, senza utilizzare JodaTime. Utilizza gli oggetti del calendario:

     public static int daysBetween(Calendar day1, Calendar day2){ Calendar dayOne = (Calendar) day1.clone(), dayTwo = (Calendar) day2.clone(); if (dayOne.get(Calendar.YEAR) == dayTwo.get(Calendar.YEAR)) { return Math.abs(dayOne.get(Calendar.DAY_OF_YEAR) - dayTwo.get(Calendar.DAY_OF_YEAR)); } else { if (dayTwo.get(Calendar.YEAR) > dayOne.get(Calendar.YEAR)) { //swap them Calendar temp = dayOne; dayOne = dayTwo; dayTwo = temp; } int extraDays = 0; int dayOneOriginalYearDays = dayOne.get(Calendar.DAY_OF_YEAR); while (dayOne.get(Calendar.YEAR) > dayTwo.get(Calendar.YEAR)) { dayOne.add(Calendar.YEAR, -1); // getActualMaximum() important for leap years extraDays += dayOne.getActualMaximum(Calendar.DAY_OF_YEAR); } return extraDays - dayTwo.get(Calendar.DAY_OF_YEAR) + dayOneOriginalYearDays ; } } 

    In Java 8, è ansible ottenere ciò utilizzando LocalDate e DateTimeFormatter . Dal Javadoc di LocalDate :

    LocalDate è un object data / ora immutabile che rappresenta una data, spesso vista come anno-mese-giorno.

    E il modello può essere costruito usando DateTimeFormatter . Ecco Javadoc e i caratteri del pattern rilevanti che ho usato:

    Simbolo – Significato – Presentazione – Esempi

    y – anno dell’era – anno – 2004; 04

    M / L – mese dell’anno – numero / testo – 7; 07; Jul; Luglio; J

    d – day-of-month – number – 10

    Ecco l’esempio:

     import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; public class Java8DateExample { public static void main(String[] args) throws IOException { final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM yyyy"); final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); final String firstInput = reader.readLine(); final String secondInput = reader.readLine(); final LocalDate firstDate = LocalDate.parse(firstInput, formatter); final LocalDate secondDate = LocalDate.parse(secondInput, formatter); final long days = ChronoUnit.DAYS.between(firstDate, secondDate); System.out.println("Days between: " + days); } } 

    Esempio di input / output con ultimo più recente:

     23 01 1997 27 04 1997 Days between: 94 

    Con più recenti prima:

     27 04 1997 23 01 1997 Days between: -94 

    Bene, potresti farlo come metodo in un modo più semplice:

     public static long betweenDates(Date firstDate, Date secondDate) throws IOException { return ChronoUnit.DAYS.between(firstDate.toInstant(), secondDate.toInstant()); } 

    Uso:

     public int getDifferenceDays(Date d1, Date d2) { int daysdiff = 0; long diff = d2.getTime() - d1.getTime(); long diffDays = diff / (24 * 60 * 60 * 1000) + 1; daysdiff = (int) diffDays; return daysdiff; } 

    Le librerie di date Java sono notoriamente danneggiate. Consiglierei di usare Joda Time . Si prenderà cura di anno bisestile, fuso orario e così via per te.

    Esempio di lavoro minimo:

     import java.util.Scanner; import org.joda.time.DateTime; import org.joda.time.Days; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class DateTestCase { public static void main(String[] args) { System.out.print("Insert first date: "); Scanner s = new Scanner(System.in); String firstdate = s.nextLine(); System.out.print("Insert second date: "); String seconddate = s.nextLine(); // Formatter DateTimeFormatter dateStringFormat = DateTimeFormat .forPattern("dd MM yyyy"); DateTime firstTime = dateStringFormat.parseDateTime(firstdate); DateTime secondTime = dateStringFormat.parseDateTime(seconddate); int days = Days.daysBetween(new LocalDate(firstTime), new LocalDate(secondTime)).getDays(); System.out.println("Days between the two dates " + days); } } 

    Il modo migliore, e si converte in una stringa come bonus;)

     protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { //Dates to compare String CurrentDate= "09/24/2015"; String FinalDate= "09/26/2015"; Date date1; Date date2; SimpleDateFormat dates = new SimpleDateFormat("MM/dd/yyyy"); //Setting dates date1 = dates.parse(CurrentDate); date2 = dates.parse(FinalDate); //Comparing dates long difference = Math.abs(date1.getTime() - date2.getTime()); long differenceDates = difference / (24 * 60 * 60 * 1000); //Convert long to String String dayDifference = Long.toString(differenceDates); Log.e("HERE","HERE: " + dayDifference); } catch (Exception exception) { Log.e("DIDN'T WORK", "exception " + exception); } } 
     String dateStart = "01/14/2015 08:29:58"; String dateStop = "01/15/2015 11:31:48"; //HH converts hour in 24 hours format (0-23), day calculation SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); Date d1 = null; Date d2 = null; d1 = format.parse(dateStart); d2 = format.parse(dateStop); //in milliseconds long diff = d2.getTime() - d1.getTime(); long diffSeconds = diff / 1000 % 60; long diffMinutes = diff / (60 * 1000) % 60; long diffHours = diff / (60 * 60 * 1000) % 24; long diffDays = diff / (24 * 60 * 60 * 1000); System.out.print(diffDays + " days, "); System.out.print(diffHours + " hours, "); System.out.print(diffMinutes + " minutes, "); System.out.print(diffSeconds + " seconds."); 

    Quando eseguo il tuo programma, non riesco nemmeno a farmi arrivare al secondo appuntamento.

    Questo è più semplice e meno sobject a errori.

     import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Date; public class Test001 { public static void main(String[] args) throws Exception { BufferedReader br = null; br = new BufferedReader(new InputStreamReader(System.in)); SimpleDateFormat sdf = new SimpleDateFormat("dd MM yyyy"); System.out.println("Insert first date : "); Date dt1 = sdf.parse(br.readLine().trim()); System.out.println("Insert second date : "); Date dt2 = sdf.parse(br.readLine().trim()); long diff = dt2.getTime() - dt1.getTime(); System.out.println("Days: " + diff / 1000L / 60L / 60L / 24L); if (br != null) { br.close(); } } } 
     // date format, it will be like "2015-01-01" private static final String DATE_FORMAT = "yyyy-MM-dd"; // convert a string to java.util.Date public static Date convertStringToJavaDate(String date) throws ParseException { DateFormat dataFormat = new SimpleDateFormat(DATE_FORMAT); return dataFormat.parse(date); } // plus days to a date public static Date plusJavaDays(Date date, int days) { // convert to jata-time DateTime fromDate = new DateTime(date); DateTime toDate = fromDate.plusDays(days); // convert back to java.util.Date return toDate.toDate(); } // return a list of dates between the fromDate and toDate public static List getDatesBetween(Date fromDate, Date toDate) { List dates = new ArrayList(0); Date date = fromDate; while (date.before(toDate) || date.equals(toDate)) { dates.add(date); date = plusJavaDays(date, 1); } return dates; }