85 votes

Comment obtenir le premier jour de la semaine et du mois en cours?

J'ai la date de plusieurs événements exprimée en millisecondes [1] et je souhaite savoir quels événements se trouvent dans la semaine et le mois en cours, mais je ne vois pas comment obtenir le premier jour (jour / mois / année). ) de la semaine en cours et convertissez-la en millisecondes, la même chose pour le premier jour du mois.

 [1]Since January 1, 1970, 00:00:00 GMT
 

184voto

COME FROM Points 882

Cette semaine en millisecondes:

 // get today and clear time of day
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

// get start of this week in milliseconds
cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
System.out.println("Start of this week:       " + cal.getTime());
System.out.println("... in milliseconds:      " + cal.getTimeInMillis());

// start of the next week
cal.add(Calendar.WEEK_OF_YEAR, 1);
System.out.println("Start of the next week:   " + cal.getTime());
System.out.println("... in milliseconds:      " + cal.getTimeInMillis());
 

Ce mois en millisecondes:

 // get today and clear time of day
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0); // ! clear would not reset the hour of day !
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);

// get start of the month
cal.set(Calendar.DAY_OF_MONTH, 1);
System.out.println("Start of the month:       " + cal.getTime());
System.out.println("... in milliseconds:      " + cal.getTimeInMillis());

// get start of the next month
cal.add(Calendar.MONTH, 1);
System.out.println("Start of the next month:  " + cal.getTime());
System.out.println("... in milliseconds:      " + cal.getTimeInMillis());
 

27voto

BalusC Points 498232

Le premier jour de la semaine peut être déterminée à l'aide d' java.util.Calendar comme suit:

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeInMillis(timestamp);
while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) {
    calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week.
}
long firstDayOfWeekTimestamp = calendar.getTimeInMillis();

Le premier jour du mois peut être déterminée comme suit:

Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTimeInMillis(timestamp);
while (calendar.get(Calendar.DATE) > 1) {
    calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of month.
}
long firstDayOfMonthTimestamp = calendar.getTimeInMillis();

Assez bavard, oui.


Java 7 viendra à une nette amélioration de la Date et de l'Heure de l'API (JSR 310). Si vous ne pouvez pas changer encore, alors vous pouvez dès à présent utiliser JodaTime , ce qui le rend moins compliqué:

DateTime dateTime = new DateTime(timestamp);
long firstDayOfWeekTimestamp = dateTime.withDayOfWeek(1).getMillis();

et

DateTime dateTime = new DateTime(timestamp);
long firstDayOfMonthTimestamp = dateTime.withDayOfMonth(1).getMillis();

14voto

alcsan Points 866

Attention!

 while (calendar.get(Calendar.DAY_OF_WEEK) > calendar.getFirstDayOfWeek()) {
    calendar.add(Calendar.DATE, -1); // Substract 1 day until first day of week.
}
 

C'est une bonne idée, mais il y a un problème: par exemple, je viens d'Ukraine et de calendar.getFirstDayOfWeek () dans mon pays a 2 (lundi). Et aujourd'hui, c'est 1 (dimanche). Dans ce cas, calendar.add n'est pas appelé.

Ainsi, le changement correct ">" en "! =":

 while (calendar.get(Calendar.DAY_OF_WEEK) != calendar.getFirstDayOfWeek()) {...
 

3voto

Diego Pino Points 2849

Pour obtenir le premier jour du mois, obtenez simplement un Date et définissez le jour actuel sur le jour 1 du mois. Effacer heure, minute, seconde et millisecondes si vous en avez besoin.

 private static Date firstDayOfMonth(Date date) {
   Calendar calendar = Calendar.getInstance();
   calendar.setTime(date);
   calendar.set(Calendar.DATE, 1);
   return calendar.getTime();
}
 

Le premier jour de la semaine est la même chose, mais en utilisant Calendar.DAY_OF_WEEK

 private static Date firstDayOfWeek(Date date) {
   Calendar calendar = Calendar.getInstance();
   calendar.setTime(date);
   calendar.set(Calendar.DAY_OF_WEEK, 1);
   return calendar.getTime();
}
 

1voto

cesarlinux Points 25

Dans ce cas:

 // get today and clear time of day
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR_OF_DAY);  <---- is the current hour not 0 hour
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
 

Donc, Calendar.HOUR_OF_DAY renvoie 8, 9, 12, 15, 18 comme heure courante. Je pense que ce sera mieux changer cette ligne par:

 c.set(Calendar.HOUR_OF_DAY,0);
 

Ainsi, la journée commence toujours à 0 heure

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X