Étant donné un objet de date, comment puis-je déterminer le dernier jour de son mois?

StackOverflow https://stackoverflow.com/questions/72381

  •  09-06-2019
  •  | 
  •  

Question

J'essaie d'utiliser le code suivant mais il renvoie le mauvais jour du mois.

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.MONTH, sampleDay.get(Calendar.MONTH)+1);
cal.set(Calendar.DAY_OF_MONTH, 0);
return cal.getTime();
Était-ce utile?

La solution

Obtenez le nombre de jours pour ce mois:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
int noOfLastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

Définissez le calendrier sur le dernier jour de ce mois:


Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));

Autres conseils

Je voudrais créer un objet de date pour le premier jour du mois suivant, puis soustraire un seul jour de l'objet de date.

tl; dr

YearMonth.from(
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
).atEndOfMonth()

java.time

La question et les autres réponses utilisent d'anciennes classes obsolètes. Ils ont été supplantés par le java.time classes intégrées à Java 8 et versions ultérieures. Consultez le Didacticiel Oracle . Une grande partie des fonctionnalités ont été rétroportées vers Java 6 & amp; 7 dans ThreeTen-Backport , puis adapté à Android dans ThreeTenABP .

LocalDate

Le LocalDate classe représente une valeur de date uniquement sans heure et sans fuseau horaire. Bien que ces objets ne stockent aucun fuseau horaire, notez que ce dernier est essentiel pour déterminer la date actuelle. À tout moment, la date varie dans le monde entier selon le fuseau horaire.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );  // 2016-06-25

AnnéeMonth

À combiner avec le YearMonth pour déterminer le dernier jour d'un mois.

YearMonth currentYearMonth = YearMonth.from( today );  // 2016-06
LocalDate lastDayOfCurrentYearMonth = currentYearMonth.atEndOfMonth();  // 2016-06-30

Par ailleurs, LocalDate et YearMonth utilisent les numéros de mois comme vous le souhaiteriez (1-12) plutôt que la boulette à vis 0-11 de l'ancien date- classes de temps. Une des nombreuses mauvaises décisions de conception qui rendent ces anciennes classes date-heure si gênantes et déroutantes.

TemporalAdjuster

Une autre approche valable consiste à utiliser un < code> TemporalAdjuster .  Voir la réponse correcte de Pierre Henry .

Utilisez calObject.getActualMaximum (calobject.DAY_OF_MONTH)

Consultez le le manuel Java de Real pour plus d'informations à ce sujet.

Il semble que vous ayez défini le calendrier au premier jour du mois suivant. Vous avez donc besoin d'une ligne supplémentaire pour soustraire un jour afin d'obtenir le dernier jour du mois de exemple de jour :

Calendar cal = Calendar.getInstance();
cal.setTime(sampleDay.getTime());
cal.roll(Calendar.MONTH, true);
cal.set(Calendar.DAY_OF_MONTH, 0);
cal.add(Calendar.DAY_OF_MONTH, -1);

En général, il est beaucoup plus facile de faire ce genre de chose en utilisant Joda Time , par exemple:

DateTime date = new DateTime(sampleDay.getTime());
return date.plusMonths(1).withDayOfMonth(0).minusDays(1).getMillis();

TemporalAdjuster

L'utilisation de la nouvelle API de date Java (relativement) est en réalité très simple:

Soit date une instance de LocalDate , par exemple:

LocalDate date = LocalDate.of(2018, 1, 22);

ou

LocalDate date = LocalDate.now();

ou bien sûr, vous pouvez l'obtenir sous forme d'entrée d'utilisateur, d'une base de données, etc.

Appliquez ensuite une implémentation de < code> TemporalAdjuster trouvé dans l'interface TemporalAdjusters classe:

LocalDate first = date.with(TemporalAdjusters.firstDayOfMonth());
LocalDate last = date.with(TemporalAdjusters.lastDayOfMonth());

Si vous utilisez la bibliothèque date4j :

DateTime monthEnd = dt.getEndOfMonth();

Je pense que cela devrait bien fonctionner:

Dim MyDate As Date = #11/14/2012#  'This is just an example date

MyDate = MyDate.AddDays(DateTime.DaysInMonth(MyDate.Year, MyDate.Month) - MyDate.Day)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top