web-dev-qa-db-fra.com

Obtenez le dernier jour du mois

Pour avoir la dernière date du mois, j'ai écrit cette fonction

/**
 * @param month integer value of month
 * @param year integer value of month
 * @return last day of month in MM/dd/YYYY format
 */
private static String getDate(int month, int year) {
    Calendar calendar = Calendar.getInstance();
    // passing month-1 because 0-->jan, 1-->feb... 11-->dec
    calendar.set(year, month - 1, 1);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
    Date date = calendar.getTime();
    DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/YYYY");
    return DATE_FORMAT.format(date);
}

pour tous les intrants, il fonctionne très bien, à une exception près en décembre, c’est-à-dire que getDate (12, 2012) renvoie le 31/12/2013, mais il doit renvoyer le 31/12/2012 . Veuillez également expliquer le comportement et la solution. 

23
Anurag Tripathi

Remplacez YYYY par yyyy 

DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");  

YYYY est faux dateformat

8
rohan kamat

Essaye ça

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

Date date = calendar.getTime();
5
Scary Wombat

Essayez d'utiliser Joda-Time , c'est plus simple:

private static String getLastDayOfMonth(int month, int year) {
    LocalDate lastDayOfMonth = new LocalDate(year, month, 1).dayOfMonth().withMaximumValue();
    return lastDayOfMonth.toString("MM/dd/yyyy");
}

4
Oussama Zoghlami
private static String getDate(int month, int year) {
    Calendar calendar = Calendar.getInstance();

    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));

    Date date = calendar.getTime();
    DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
    return DATE_FORMAT.format(date);
}
3
Elton Wang

tl; dr

YearMonth.of( 2016 , 6 )
         .atEndOfMonth()
         .toString()

2016-06-30

Java.time

Très facile avec les classes Java.time intégrées à Java 8 et versions ultérieures. Back-ported to Java 6 & 7 , et plus encore adapté à Android .

YearMonth

Utilisez la pratique YearMonth class. 

Conseil: Faites passer des objets de cette classe autour de votre base de code plutôt que de simples entiers pour bénéficier de la sécurité de type, des valeurs valides garanties et d'un code plus documenté.

YearMonth yearMonth = YearMonth.of( 2016 , 6 );

…ou…

YearMonth yearMonth = YearMonth.of( 2016 , Month.JUNE );

LocalDate

Puis demandez le dernier jour de ce mois, représenté par LocalDate .

LocalDate endOfMonth = yearMonth.atEndOfMonth();

2016-06-30

Les cordes

Le résultat de toString vous voyez ci-dessus, où une chaîne a été générée à l'aide de la norme ISO 8601 formatage. Vous pouvez utiliser d'autres formats.

La classe DateTimeFormatter peut automatiquement traduire en une langue humaine et appliquer des normes culturelles à des questions telles que la période par rapport à une virgule ou le classement des parties année-mois-jour.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT );
formatter = formatter.withLocale( Locale.US );  // Re-assign JVM’s current default Locale that was implicitly applied to the formatter.
String output = localDate.format( formatter ); 

Le Locale.US nous donne un format mois/jour/année. Vous pouvez également spécifier un modèle explicite en appelant DateTimeFormatter.ofPattern .

2
Basil Bourque

Essaye ça

private static String getDate(int month, int year)
{
    Calendar dateCal = Calendar.getInstance();
    dateCal.set(year, month, 2);
    int maxDay = dateCal.getActualMaximum(Calendar.DAY_OF_MONTH);

    String pattern = "MMMM";
    SimpleDateFormat obDateFormat = new SimpleDateFormat(pattern);
    String monthName = obDateFormat.format(dateCal.getTime());

    return "Last date of " + monthName + " " + year + " : " + maxDay;
}
0
parag.rane
With Java 8 DateTime / LocalDateTime :

private static String getDate(int month, int year) {        
    Month monthObj = Month.of(month);       
    LocalDate date = LocalDate.of(year, month, monthObj.maxLength());
    return date.format(DateTimeFormatter.ofPattern("MM/dd/yyyy", Locale.US));
}
0
Zeeshan

Vous pouvez utiliser le code suivant pour obtenir le dernier jour du mois

public static String getLastDayOfTheMonth(String date) {
        String lastDayOfTheMonth = "";

        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
        try{
        Java.util.Date dt= formatter.parse(date);
        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(dt);  

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

        Java.util.Date lastDay = calendar.getTime();  

        lastDayOfTheMonth = formatter.format(lastDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return lastDayOfTheMonth;
    }
0
Tanmay kumar shaw

Envisagez-vous une année bissextile ici aussi? sinon, vous pouvez essayer le code ci-dessous:

public static Date calculateMonthEndDate(int month, int year) {
    int[] daysInAMonth = { 29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int day = daysInAMonth[month];
    boolean isLeapYear = new GregorianCalendar().isLeapYear(year);

    if (isLeapYear && month == 2) {
        day++;
    }
    GregorianCalendar gc = new GregorianCalendar(year, month - 1, day);
    Date monthEndDate = new Date(gc.getTime().getTime());
    return monthEndDate;
}
0
Pranav