2015-01-27 17 views
6

Dove è una funzione per ottenere l'ultimo giorno del mese nel mio servizio?L'ultimo giorno del mese sbagliato

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); 

Quindi, questo metodo funziona correttamente altrove, ma negli Stati Uniti l'ultimo giorno è sempre 29 (ultimo giorno - 1)

stringDate è data nel formato "AAAA-MM-dd"

+1

Qual è il valore 'stringDate'? –

+2

Perché inizia da 0, vedere l'API. – Maroun

+0

@waldermar, ci hai fornito il ** formato ** di 'stringDate' ma ** non ** il ** valore effettivo ** di' stringDate'. Forniscici 2 o più valori effettivi che convalideranno la tua domanda, includi la data degli Stati Uniti (se ottieni la mia domanda). –

risposta

1

Java La data ha un'API molto scarsa. Invece di questo ti consiglierei di usare Joda Time.

In Joda sarebbe simile a questa:

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

per favore non farlo, Java 8 ha molto meglio Date API – Mysterion

+0

Non molto meglio ma leggermente. PS non tutti sono così fortunati ad usare Java 8;) – MAGx2

0

Se non si dispone di Java 8, questo è molto compatto con 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(); 
    } 
} 

E un piccolo 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")); 

} 

e il test i risultati:

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

Se fai hanno Java 8, si potrebbe utilizzare il codice come questo:

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()); 
    } 
} 

Il codice di prova cambia solo un po '.

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)); 

    } 
} 

ma i risultati sono gli stessi.

Data 2015-01-27 diventa 2015-01-31.

Data 2015-02-02 diventa 2015-02-28.

0

Stai scherzando con lo TimeZones.

Quando si esegue Date date = format.parse(stringDate); si sta creando un oggetto Date con TimeZone dell'oggetto DateFormat. Teoricamente, se lo TimeZone è lo stesso per tutti gli oggetti DateFormat e Calendar, si dovrebbe andare bene. Verifica se sono coerenti con il metodo getTimeZone().

Se la TimeZone del primo DateFormat è sbagliato (ad esempio, è il vostro TimeZone o UTC o GMT), si otterrà una conversione UTC-008 nel secondo TimeZone (e nel Calendar) con conseguente il giorno mancante da quando si inizia da mezzanotte.

A giudicare dal codice è il stringDate in sé che è stato erroneamente convertito da qualche altra parte ...

Problemi correlati