2015-01-27 11 views
6

Wo ist eine Funktion, um den letzten Tag des Monats in meinem Dienst zu bekommen?Falscher letzter Tag des Monats

DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH); 
     Date date = format.parse(stringDate); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTime(date); 

     calendar.add(Calendar.MONTH, 1); 
     calendar.set(Calendar.DAY_OF_MONTH, 1); 
     calendar.add(Calendar.DATE, -1); 

     Date lastDayOfMonth = calendar.getTime(); 

     DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 

     return sdf.format(lastDayOfMonth); 

So funktioniert diese Methode richtig an anderer Stelle, aber in US letzten Tag ist immer 29 (letzter Tag - 1)

stringDate ist Datum im Format "yyyy-MM-dd"

+1

Was ist der 'stringDate' Wert? –

+2

Weil es bei 0 beginnt, siehe API. – Maroun

+0

@waldermar, Sie haben uns das ** Format ** von 'stringDate', aber ** nicht ** den ** tatsächlichen Wert ** von' stringDate' zur Verfügung gestellt. Geben Sie uns 2 oder mehr tatsächliche Werte, die Ihre Frage bestätigen, einschließlich Ihres US-Datums (wenn Sie meine Frage erhalten). –

Antwort

1

Java Datum hat eine sehr schlechte API. Stattdessen würde ich Ihnen empfehlen, Joda Time zu verwenden.

In Joda würde es so aussehen:

LocalDate endOfMonth = date.dayOfMonth().withMaximumValue(); 
+2

bitte tun Sie das nicht, Java 8 hat viel bessere Date API – Mysterion

+0

Nicht viel besser, aber leicht. PS nicht jeder ist so glücklich Java 8 zu benutzen;) – MAGx2

0

Wenn Sie nicht Java 8 haben, das ist sehr kompakt mit JodaTime.

import org.joda.time.DateTime; 

public class SoLastDay { 
    public DateTime lastDay(final String yyyy_MM_dd) { 
     DateTime givenDate = new DateTime(yyyy_MM_dd); 
     return givenDate.dayOfMonth().withMaximumValue(); 
    } 
} 

Und ein kleiner Test ...

@Test 
public void testLastDay() throws Exception { 
    SoLastDay soLastDay = new SoLastDay(); 

    String date1 = "2015-01-27"; 
    System.out.printf("Date %s becomes %s.\n", date1, soLastDay.lastDay(date1).toString("yyyy-MM-dd")); 

    String date2 = "2015-02-02"; 
    System.out.printf("Date %s becomes %s.\n", date2, soLastDay.lastDay(date2).toString("yyyy-MM-dd")); 

} 

und die Testergebnisse:

Date 2015-01-27 becomes 2015-01-31. 
Date 2015-02-02 becomes 2015-02-28. 
0

Wenn Sie tun haben Java 8, Sie Code verwenden könnten:

import java.time.LocalDate; 
import java.time.format.DateTimeFormatter; 
import java.time.temporal.TemporalAdjusters; 

public class SoLastDayJava8 { 
    static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 

    public LocalDate lastDay(final String yyyy_MM_dd) { 
     LocalDate givenDate = LocalDate.parse(yyyy_MM_dd, formatter); 
     return givenDate.with(TemporalAdjusters.lastDayOfMonth()); 
    } 
} 

Der Testcode ändert sich nur ein wenig.

public class SoLastDayJava8Test { 

    @Test 
    public void testLastDay() throws Exception { 
     SoLastDayJava8 soLastDay = new SoLastDayJava8(); 

     String date1 = "2015-01-27"; 
     System.out.printf("Date %s becomes %s.\n", date1, soLastDay.lastDay(date1)); 

     String date2 = "2015-02-02"; 
     System.out.printf("Date %s becomes %s.\n", date2, soLastDay.lastDay(date2)); 

    } 
} 

Aber die Ergebnisse sind die gleichen.

Datum 2015-01-27 wird 2015-01-31.

Datum 2015.02.02 wird 2015.02.28.

0

Sie sind mit der TimeZones.

Wenn Sie Date date = format.parse(stringDate); führen Sie mit dem TimeZone des DateFormat Objekt ein Date Objekt erstellen. Theoretisch, wenn die TimeZone für alle Ihre DateFormat und Calendar Objekte gleich ist, sollten Sie in Ordnung sein. Überprüfen Sie, ob sie mit der Methode getTimeZone() übereinstimmen.

Wenn die TimeZone des ersten DateFormat falsch ist (zB ist Ihr TimeZone oder UTC oder GMT), erhalten Sie eine UTC-008 Umwandlung in der zweiten TimeZone bekommen (und im Calendar) in den fehlenden Tag führt, da Sie beginnen ab Mitternacht.

zu urteilen aus dem Code wird die stringDate selbst, die zu Unrecht woanders umgewandelt wurde ...

Verwandte Themen