Nombre de jours dans un mois particulier d'une année donnée?

158

Comment savoir combien de jours a un mois particulier d'une année particulière?

String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this
Klausos Klausos
la source
7
Quelle est exactement votre question?
ShaMan-H_Fel
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont maintenant héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir le didacticiel d'Oracle .
Basil Bourque

Réponses:

368

Java 8 et versions ultérieures

@Warren M. Nocos. Si vous essayez d'utiliser la nouvelle API de date et d'heure de Java 8 , vous pouvez utiliser java.time.YearMonthclass. Voir le didacticiel Oracle .

// Get the number of days in that month
YearMonth yearMonthObject = YearMonth.of(1999, 2);
int daysInMonth = yearMonthObject.lengthOfMonth(); //28  

Test: essayez un mois dans une année bissextile:

yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29 

Java 7 et versions antérieures

Créez un calendrier, définissez l'année et le mois et utilisez getActualMaximum

int iYear = 1999;
int iMonth = Calendar.FEBRUARY; // 1 (months begin with 0)
int iDay = 1;

// Create a calendar object and set year and month
Calendar mycal = new GregorianCalendar(iYear, iMonth, iDay);

// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 28

Test : essayez un mois dans une année bissextile:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
Hemant Metalia
la source
2
Comment faire cela sur la nouvelle API de date et d'heure de Java 8?
Warren M. Nocos
2
@ WarrenM.Nocos désolé pour la réponse tardive, mais je n'étais pas actif ces mois-ci. s'il vous plaît vérifier l'édition pour la solution pour java 8.
Hemant Metalia
Comme avant Java 8… Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et Java 7 dans le projet ThreeTen-Backport . Adapté pour Android antérieur dans le projet ThreeTenABP . Voir Comment utiliser ThreeTenABP… .
Basil Bourque
43

Code pour java.util.Calendar

Si vous devez utiliser java.util.Calendar, je suppose que vous voulez:

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

Code pour Joda Time

Personnellement, cependant, je suggère d'utiliser Joda Time au lieu de java.util.{Calendar, Date}commencer, auquel cas vous pouvez utiliser:

int days = chronology.dayOfMonth().getMaximumValue(date);

Notez que plutôt que d'analyser les valeurs de chaîne individuellement, il serait préférable d'obtenir l'API de date / heure que vous utilisez pour l'analyser. Dans java.util.*vous pourriez utiliser SimpleDateFormat; dans Joda Time, vous utiliseriez un fichier DateTimeFormatter.

Jon Skeet
la source
27

Vous pouvez utiliser la Calendar.getActualMaximumméthode:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);
Aleks G
la source
22

java.time.LocalDate

Depuis Java 1.8, vous pouvez utiliser la méthode lengthOfMonthsur java.time.LocalDate:

LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
Alexandre DuBreuil
la source
7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;
zoidbot
la source
Calendrier c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // vous pouvez définir l'année avant d'obtenir le maximum réel car ils peuvent ne pas être les mêmes. c.-à-d. février 2011 et 2012 ne sont pas de la même durée (année bissextile)
Rose
5

C'est la manière mathématique:

Par année, mois (1 à 12):

int daysInMonth = month == 2 ? 
    28 + (year % 4 == 0 ? 1:0) - (year % 100 == 0 ? (year % 400 == 0 ? 0 : 1) : 0) :
    31 - (month-1) % 7 % 2;
Shl
la source
3

J'irais pour une solution comme celle-ci:

int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
    int year = getYear();
    final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
    daysInMonth = monthEnum.length(leapYear);
} else {
    daysInMonth = monthEnum.maxLength();
}

Si le mois n'est pas février (92% des cas), cela dépend uniquement du mois et il est plus efficace de ne pas impliquer l'année. De cette façon, vous n'avez pas besoin d'appeler la logique pour savoir s'il s'agit d'une année bissextile et vous n'avez pas besoin d'obtenir l'année dans 92% des cas. Et c'est toujours un code propre et très lisible.

Stefan Mondelaers
la source
1
Je préférerais laisser toute la logique à une méthode de bibliothèque éprouvée - je pense que vous optimisez très prématurément, et les méthodes de bibliothèque ne sont pas si inefficaces. Toujours voté pour l'utilisation du java.time moderne.
Ole VV
@ OleV.V. Certes, dans de nombreux cas, laisser l'optimisation à une bibliothèque éprouvée peut être mieux. Mais, dans ce cas, les bibliothèques existantes devront passer un mois et une année. Cela signifie donc que je dois faire tout ce qu'il faut pour obtenir l'année de toute façon, même si la méthode n'utilise pas la valeur dans 92% des cas. Donc, c'est une partie qu'il ne peut pas optimiser pour moi. Mon raisonnement est similaire à la raison pour laquelle vous ne devriez pas faire un appel de méthode pour obtenir une valeur à transmettre à un enregistreur qui pourrait être désactivé. Pas question que l'enregistreur puisse optimiser cela.
Stefan Mondelaers
1

En Java8, vous pouvez utiliser get ValueRange à partir d'un champ d'une date.

LocalDateTime dateTime = LocalDateTime.now();

ChronoField chronoField = ChronoField.MONTH_OF_YEAR;
long max = dateTime.range(chronoField).getMaximum();

Cela vous permet de paramétrer sur le terrain.

Jamie Lister
la source
1

Aussi simple que cela, pas besoin d'importer quoi que ce soit

public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}
Ajay Chauhan
la source
C'est correct, si vous n'avez pas besoin de dates historiques ou de dates dans un avenir lointain. Pour février d'années qui sont des multiples de 100 mais pas des multiples de 400, ce sera faux. Mais je suis d'accord, dans la plupart des applications, cela fera l'affaire et c'est efficace.
Stefan Mondelaers
1
// 1 means Sunday ,2 means Monday .... 7 means Saturday
//month starts with 0 (January)

MonthDisplayHelper monthDisplayHelper = new MonthDisplayHelper(2019,4);
int numbeOfDaysInMonth = monthDisplayHelper.getNumberOfDaysInMonth();
user11527435
la source
1
Il convient de noter que c'est pour Android ( android.util.MonthDisplayHelper)
barbsan
0
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/*
 * 44. Return the number of days in a month
 * , where month and year are given as input.
 */
public class ex44 {
    public static void dateReturn(int m,int y)
    {
        int m1=m;
        int y1=y;
        String str=" "+ m1+"-"+y1;
        System.out.println(str);
        SimpleDateFormat sd=new SimpleDateFormat("MM-yyyy");

        try {
            Date d=sd.parse(str);
            System.out.println(d);
            Calendar c=Calendar.getInstance();
            c.setTime(d);
            System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
dateReturn(2,2012);


    }

}
madhi vanan
la source
1
Quelle valeur cette réponse apporte-t-elle par rapport aux réponses existantes et acceptées? Veuillez également ajouter une explication ou un récit avec votre code. StackOverflow est plus qu'une bibliothèque d'extraits de code.
Basil Bourque
0
public class Main {

    private static LocalDate local=LocalDate.now();
    public static void main(String[] args) {

            int month=local.lengthOfMonth();
            System.out.println(month);

    }
}
Nodirbek Hasanboev
la source
6
Ajoutez également quelques explications.
BlackBeard
1
Bienvenue dans Stack Overflow! Bien que cet extrait de code puisse être la solution, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
yivi
0

L'utilisation d'une CalendarAPI obsolète doit être évitée.

Dans Java8 ou version supérieure, cela peut être fait avec YearMonth.

Exemple de code:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);
user6690200
la source
Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
Vlad
0

Rendons les choses aussi simples si vous ne voulez pas coder en dur la valeur de l'année et du mois et que vous voulez prendre la valeur de la date et de l'heure actuelles:

Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );
RANA DINESH
la source
0

Vous pouvez utiliser la méthode Calendar.getActualMaximum:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
int numDays = calendar.getActualMaximum(Calendar.DATE);

Et mois-1 est En raison du mois prend son numéro d'origine du mois tandis que dans la méthode prend l'argument comme ci-dessous dans Calendar.class

public int getActualMaximum(int field) {
   throw new RuntimeException("Stub!");
}

Et le (champ int) est comme ci-dessous.

public static final int JANUARY = 0;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;
Dharmishtha
la source
0

La méthode suivante vous fournira le nombre de jours dans un mois particulier

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}
Shaw Tanmay Kumar
la source
0

Une variance optimale et performante:

public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}

Pour plus de détails sur l'algorithme de saut, cliquez ici

magiccrafter
la source
-1
String  MonthOfName = "";
int number_Of_DaysInMonth = 0;

//year,month
numberOfMonth(2018,11); // calling this method to assign values to the variables MonthOfName and number_Of_DaysInMonth 

System.out.print("Number Of Days: "+number_Of_DaysInMonth+"   name of the month: "+  MonthOfName );

public void numberOfMonth(int year, int month) {
    switch (month) {
        case 1:
            MonthOfName = "January";
            number_Of_DaysInMonth = 31;
            break;
        case 2:
            MonthOfName = "February";
            if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
                number_Of_DaysInMonth = 29;
            } else {
                number_Of_DaysInMonth = 28;
            }
            break;
        case 3:
            MonthOfName = "March";
            number_Of_DaysInMonth = 31;
            break;
        case 4:
            MonthOfName = "April";
            number_Of_DaysInMonth = 30;
            break;
        case 5:
            MonthOfName = "May";
            number_Of_DaysInMonth = 31;
            break;
        case 6:
            MonthOfName = "June";
            number_Of_DaysInMonth = 30;
            break;
        case 7:
            MonthOfName = "July";
            number_Of_DaysInMonth = 31;
            break;
        case 8:
            MonthOfName = "August";
            number_Of_DaysInMonth = 31;
            break;
        case 9:
            MonthOfName = "September";
            number_Of_DaysInMonth = 30;
            break;
        case 10:
            MonthOfName = "October";
            number_Of_DaysInMonth = 31;
            break;
        case 11:
            MonthOfName = "November";
            number_Of_DaysInMonth = 30;
            break;
        case 12:
            MonthOfName = "December";
            number_Of_DaysInMonth = 31;
    }
}
azhar
la source
-1

CA marchait bien pour moi.

Ceci est un exemple de sortie

import java.util.*;

public class DaysInMonth { 

    public static void main(String args []) { 

        Scanner input = new Scanner(System.in); 
        System.out.print("Enter a year:"); 

        int year = input.nextInt(); //Moved here to get input after the question is asked 

        System.out.print("Enter a month:"); 
        int month = input.nextInt(); //Moved here to get input after the question is asked 

        int days = 0; //changed so that it just initializes the variable to zero
        boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 

        switch (month) { 
            case 1: 
                days = 31; 
                break; 
            case 2: 
                if (isLeapYear) 
                    days = 29; 
                else 
                    days = 28; 
                break; 
            case 3: 
                days = 31; 
                break; 
            case 4: 
                days = 30; 
                break; 
            case 5: 
                days = 31; 
                break; 
            case 6: 
                days = 30; 
                break; 
            case 7: 
                days = 31; 
                break; 
            case 8: 
                days = 31; 
                break; 
            case 9: 
                days = 30; 
                break; 
            case 10: 
                days = 31; 
                break; 
            case 11: 
                days = 30; 
                break; 
            case 12: 
                days = 31; 
                break; 
            default: 
                String response = "Have a Look at what you've done and try again";
                System.out.println(response); 
                System.exit(0); 
        } 

        String response = "There are " + days + " Days in Month " + month + " of Year " + year + ".\n"; 
        System.out.println(response); // new line to show the result to the screen. 
    } 
} //[email protected]
Abhinav S Thakur
la source
-1
String date = "11-02-2000";
String[] input = date.split("-");
int day = Integer.valueOf(input[0]);
int month = Integer.valueOf(input[1]);
int year = Integer.valueOf(input[2]);
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.DATE, day);
//since month number starts from 0 (i.e jan 0, feb 1), 
//we are subtracting original month by 1
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);
Nagaraju Budigam
la source
Pas besoin de répondre à une question qui est déjà acceptée, jusqu'à ce que cette réponse soit invalide.
Deepak