Wie subtrahieren Sie Daten in Java?

Mein Herz blutet innerlich, nachdem ich so tief gegangen bin, um zwei Daten zu subtrahieren, um die Anzahl der Tage zu berechnen:

GregorianCalendar c1 = new GregorianCalendar(); GregorianCalendar c2 = new GregorianCalendar(); c1.set(2000, 1, 1); c2.set(2010,1, 1); long span = c2.getTimeInMillis() - c1.getTimeInMillis(); GregorianCalendar c3 = new GregorianCalendar(); c3.setTimeInMillis(span); long numberOfMSInADay = 1000*60*60*24; System.out.println(c3.getTimeInMillis() / numberOfMSInADay); //3653 

wo es nur 2 Zeilen Code in .NET oder irgendeiner modernen Sprache gibt, die du nennst.

Ist das grausam von Java? Oder gibt es eine versteckte Methode, die ich kennen sollte?

Anstatt GregorianCalendar zu verwenden, ist es in Ordnung, Date-class in util zu verwenden? Wenn ja, sollte ich auf subtile Dinge wie das Jahr 1970 achten?

Vielen Dank

   

Es ist in der Tat einer der größten epischen Fehler in der Standard-Java-API. Haben Sie ein wenig Geduld, dann erhalten Sie Ihre Lösung im Geschmack der neuen Date and Time API, die von JSR 310 / ThreeTen spezifiziert wurde und die (wahrscheinlich) in das kommende Java 8 aufgenommen wird.

Bis dahin kannst du mit JodaTime durchkommen .

 DateTime dt1 = new DateTime(2000, 1, 1, 0, 0, 0, 0); DateTime dt2 = new DateTime(2010, 1, 1, 0, 0, 0, 0); int days = Days.daysBetween(dt1, dt2).getDays(); 

Sein Schöpfer, Stephen Colebourne, ist übrigens der Typ hinter JSR 310, also sieht es ähnlich aus.

Sie können den folgenden Ansatz verwenden:

 SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd"); long d1=formater.parse("2001-1-1").getTime(); long d2=formater.parse("2001-1-2").getTime(); System.out.println(Math.abs((d1-d2)/(1000*60*60*24))); 

Wenn Sie mit Datumsangaben arbeiten, ist es eine gute Idee, sich die joda-Zeitbibliothek anzusehen, um ein vernünftigeres Datumsmanipulationsmodell zu erhalten.

http://joda-time.sourceforge.net/

Nun, Sie können die dritte Kalenderinstanz entfernen.

 GregorianCalendar c1 = new GregorianCalendar(); GregorianCalendar c2 = new GregorianCalendar(); c1.set(2000, 1, 1); c2.set(2010,1, 1); c2.add(GregorianCalendar.MILLISECOND, -1 * c1.getTimeInMillis()); 

Hier ist der grundlegende Ansatz,

 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date beginDate = dateFormat.parse("2013-11-29"); Date endDate = dateFormat.parse("2013-12-4"); Calendar beginCalendar = Calendar.getInstance(); beginCalendar.setTime(beginDate); Calendar endCalendar = Calendar.getInstance(); endCalendar.setTime(endDate); 

Es gibt eine einfache Möglichkeit, es zu implementieren. Wir können die Calendar.add-Methode mit Schleife verwenden. Die Minus-Tage zwischen beginDate und endDate und der implementierte Code wie unten ,

 int minusDays = 0; while (true) { minusDays++; // Day increasing by 1 beginCalendar.add(Calendar.DAY_OF_MONTH, 1); if (dateFormat.format(beginCalendar.getTime()). equals(dateFormat.format(endCalendar).getTime())) { break; } } System.out.println("The subtraction between two days is " + (minusDays + 1));**