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.
Remplacez YYYY
par yyyy
DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy");
YYYY
est faux dateformat
Essaye ça
calendar.add(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DATE, -1);
Date date = calendar.getTime();
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");
}
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);
}
YearMonth.of( 2016 , 6 )
.atEndOfMonth()
.toString()
2016-06-30
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
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
.
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;
}
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));
}
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;
}
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;
}