web-dev-qa-db-fra.com

Récupérer la date du lundi de la semaine en cours

Nous avons un utilitaire qui fonctionnera tous les jours du lundi au vendredi. Il mettra à jour un certain nombre de fichiers dans un outil de gestion de contenu. La dernière date de modification associée à ce fichier devrait être la date du lundi de cette semaine. J'ai écrit le programme suivant pour récupérer la date du lundi de la semaine en cours. Mais je ne suis toujours pas sûr que cela fonctionnerait pour tous les scénarios. Quelqu'un a-t-il une meilleure solution?

Calendar c = Calendar.getInstance();
c.setTime(new Date());
System.out.println(c.get(Calendar.DAY_OF_MONTH));
System.out.println(c.get(Calendar.DAY_OF_WEEK));
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2;
c.set(Calendar.DAY_OF_MONTH,mondayNo);
System.out.println("Date "+c.getTime());
23
Shashank Kadne

Je recommande fortement d'utiliser Joda Time à la place (pour tout votre travail de date/heure, pas seulement pour cela):

// TODO: Consider time zones, calendars etc
LocalDate now = new LocalDate();
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY);
System.out.println(monday);

Notez que, comme vous avez utilisé Monday ici, qui correspond au premier jour de la semaine dans Joda Time, cette option renvoie toujours un jour antérieur (ou le même jour). Si vous avez choisi mercredi (par exemple), cela ferait avancer au mercredi à partir de lundi ou mardi. Vous pouvez toujours ajouter ou soustraire une semaine si vous avez besoin de "mercredi prochain" ou "mercredi précédent".

EDIT: Si vous vraiment voulez utiliser Java.util.Date/Calendar, vous pouvez utiliser:

Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());

Vous pouvez utiliser Calendar.setFirstDayOfWeek pour indiquer si une semaine est lundi-dimanche ou dimanche-samedi; Je crois que le réglage du jour de la semaine restera dans la semaine en cours - mais testez-le.

47
Jon Skeet

tl; dr

LocalDate previousMonday = 
    LocalDate.now( ZoneId.of( "America/Montreal" ) )
             .with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

Java.time

La classe Java.util.Calendar et la bibliothèque Joda-Time ont été supplantées par le framework Java.time intégré à Java 8 et versions ultérieures. Voir Tutoriel Oracle . Une grande partie de la fonctionnalité Java.time a été rétroportée vers Java 6 et 7 dans ThreeTen-Backport et ensuite adaptée à Android dans ThreeTenABP .

La classe Java.time.LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

La détermination de la date du jour nécessite un fuseau horaire, un ZoneId .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );

L'interface TemporalAdjuster (voir Didacticiel ) est un moyen puissant mais simple de manipuler les valeurs date-heure. La classe TemporalAdjusters (notez le pluriel) implémente des ajustements très utiles. Ici, nous utilisons previous( DayOfWeek) .

L'en-tête DayOfWeek pratique vous permet de spécifier facilement un jour de la semaine.

LocalDate previousMonday = today.with( TemporalAdjusters.previous( DayOfWeek.MONDAY ) );

Si aujourd'hui est lundi et que vous souhaitez utiliser aujourd'hui plutôt qu'il y a une semaine, appelez previousOrSame .


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode { mode maintenance }, conseille la migration vers les classes Java.time .

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* classes.

Où obtenir les classes Java.time? 

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Les versions ultérieures d'Android regroupent des implémentations des classes Java.time.
    • Pour les anciens Android (<26), le projet ThreeTenABP s’adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

17
Basil Bourque

Ce qui suit fonctionnera, y compris les mois d'emballage:

Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
c.setTime(new Date());
int today = c.get(Calendar.DAY_OF_WEEK);
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY);
System.out.println("Date "+c.getTime());

Si, toutefois, vous modifiez votre application un dimanche (par exemple le dimanche 12 février), la date sera celle du lundi suivant. Selon vos besoins (l'application ne fonctionnera que du lundi au vendredi), cela ne devrait pas poser de problème.

6
radimpe

Comme Jon l'a suggéré, la méthode calendar.set fonctionne ....... Je l'ai testée à la fois dans le cas d'un lundi du même mois et d'un autre mois en utilisant l'extrait suivant:

Calendar c = Calendar.getInstance();
//ensure the method works within current month
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//go to the 1st week of february, in which monday was in january
c.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Date " + c.getTime());
//test that setting day_of_week to monday gives a date in january
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
System.out.println("Date " + c.getTime());
//same for tuesday
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
System.out.println("Date " + c.getTime());

Les resultats:

Date Mon Feb 13 10:29:41 CET 2012
Date Wed Feb 01 10:29:41 CET 2012
Date Mon Jan 30 10:29:41 CET 2012
Date Tue Jan 31 10:29:41 CET 2012
2
Simon Baslé

Qu'en est-il de Joda Time bibliothèque ... Regardez ceci réponse ...

1
PrimosK

Pour la version Android 6.0 ou l'utilisation de la râpe:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 8, month = 2, year = 2019;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);  //change de day to monday
String dateMonday= sdf.format(c.getTime());

Pour la version Android 5.1 ou inférieure, cela ne fonctionne pas correctement, j'ai créé ma propre méthode.

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
int day = 8, month = 2, year = 2019;
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.MONDAY);
//set the date with your date or the current date c.set(new Date());
c.set(year, month, day);

int diaSemana = c.get(Calendar.DAY_OF_WEEK);
for (int i = 0; i < 7; i++) {
   if (diaSemana != Calendar.MONDAY) {
     if (day > 2) {
       day--;
       c.set(year, month, day);
       diaSemana = c.get(Calendar.DAY_OF_WEEK);
     } else {
       if (month > 0) {
       month--;
       c.set(year, month, 1);
       day = c.getActualMaximum(Calendar.DAY_OF_MONTH);
       c.set(year, month, day);
     } else {
       month = 12;
       year--;
       c.set(year, month, 31);
     }
     diaSemana = c.get(Calendar.DAY_OF_WEEK);
    }
   } else {
   break;
   }
 }
String dateMonday= sdf.format(c.getTime());
0
Adolfo Rangel

si vous ne voulez pas utiliser Joda Time, vous pouvez le faire comme ceci pour trouver les semaines -> (fonctionne sur Android)

public static ArrayList<String> getWeeks(int month) {

ArrayList<String> arrayListValues = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d");

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.MONTH, month);

int day = calendar.get(Calendar.DAY_OF_WEEK);
while (day != 1) {
  calendar.add(Calendar.DATE, 1);
  day = calendar.get(Calendar.DAY_OF_WEEK);
}

calendar.add(Calendar.DATE, -14);
String y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
String y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);

 y1 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 6);
 y2 = sdf.format(calendar.getTime());
calendar.add(Calendar.DATE, 1);
arrayListValues.add(y1 + " - " + y2);



for (int i = 0; i < 10; i++) {

  y1 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 6);
  y2 = sdf.format(calendar.getTime());
  calendar.add(Calendar.DATE, 1);
  arrayListValues.add(y1 + " - " + y2);
}

return arrayListValues;
}
0
OWADVL