2010-11-09 25 views

Répondre

0
Calendar cal = Calendar.getInstance(); 
int dayofweek = cal.get(Calendar.DAY_OF_WEEK); 

cela devrait faire ce que vous voulez.
modifier: avec un peu plus de calculer les étapes, vous pourriez avoir résultat :) (désolé pour confondre votre titre)

1
public static Date getDate(int day, int weekNo, int month, int year) { 
    Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.DATE,1); 
    cal.set(Calendar.YEAR, year); 
    cal.set(Calendar.MONTH, month); 
    for (int i = 0; i < 31; i++) { 
     if (cal.get(Calendar.WEEK_OF_MONTH) == weekNo 
       && cal.get(Calendar.DAY_OF_WEEK) == day) { 
      return cal.getTime(); 
     } 
     cal.add(Calendar.DATE,1); 
    } 
    return null; 
    } 

Indicatif téléphonique

System.out.println(""+getDate(Calendar.MONDAY, 2, Calendar.DECEMBER,2010)); 

Sortie

Mon Dec 06 15:09:00 IST 2010 
+0

J'ai formaté le code et corrigé les erreurs de syntaxe. Mais il y a encore un énorme bug là-dedans que vous devriez corriger (indice: essayez simplement d'exécuter ceci) –

+0

@seanizer Merci, Mise à jour du code. –

+0

Joda Le temps n'est pas seulement meilleur: JODA TIME ROCKS POUR LES OPÉRATIONS DATE/HEURE – iirekm

5

Voici une méthode utilitaire qui fait que, à l'aide DateUtils de Apache Commons/Lang:

/** 
* Get the n-th x-day of the month in which the specified date lies. 
* @param input the specified date 
* @param weeks 1-based offset (e.g. 1 means 1st week) 
* @param targetWeekDay (the weekday we're looking for, e.g. Calendar.MONDAY 
* @return the target date 
*/ 
public static Date getNthXdayInMonth(final Date input, 
    final int weeks, 
    final int targetWeekDay){ 

    // strip all date fields below month 
    final Date startOfMonth = DateUtils.truncate(input, Calendar.MONTH); 
    final Calendar cal = Calendar.getInstance(); 
    cal.setTime(startOfMonth); 
    final int weekDay = cal.get(Calendar.DAY_OF_WEEK); 
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay); 
    return modifier > 0 
     ? DateUtils.addDays(startOfMonth, modifier) 
     : startOfMonth; 
} 

Code d'essai:

// Get this month's third thursday 
System.out.println(getNthXdayInMonth(new Date(), 3, Calendar.THURSDAY)); 

// Get next month's second wednesday: 
System.out.println(getNthXdayInMonth(DateUtils.addMonths(new Date(), 1), 
    2, 
    Calendar.WEDNESDAY) 
); 

Sortie:

Jeu 18 novembre 00:00:00 CET 2010
Mer 8 décembre 00:00:00 CET 2010


Et voici une version JodaTime du même code (je n'ai jamais utilisé JodaTime auparavant, donc il y a probablement un moyen plus simple de le faire):

/** 
* Get the n-th x-day of the month in which the specified date lies. 
* 
* @param input 
*   the specified date 
* @param weeks 
*   1-based offset (e.g. 1 means 1st week) 
* @param targetWeekDay 
*   (the weekday we're looking for, e.g. DateTimeConstants.MONDAY 
* @return the target date 
*/ 
public static DateTime getNthXdayInMonthUsingJodaTime(final DateTime input, 
    final int weeks, 
    final int targetWeekDay){ 

    final DateTime startOfMonth = 
     input.withDayOfMonth(1).withMillisOfDay(0); 
    final int weekDay = startOfMonth.getDayOfWeek(); 
    final int modifier = (weeks - 1) * 7 + (targetWeekDay - weekDay); 
    return modifier > 0 ? startOfMonth.plusDays(modifier) : startOfMonth; 
} 

Code d'essai:

// Get this month's third thursday 
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime(), 
    3, 
    DateTimeConstants.THURSDAY)); 

// Get next month's second wednesday: 
System.out.println(getNthXdayInMonthUsingJodaTime(new DateTime().plusMonths(1), 
    2, 
    DateTimeConstants.WEDNESDAY)); 

Sortie:

2010-11-18T00: 00: 00.000 + 01: 00
2010-12-08T00: 00: 00.000 + 01: 00

0

tl; dr

LocalDate firstFridayThisMonth = 
    LocalDate.now(ZoneId.of("America/Montreal")) 
      .with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY)) 

Utilisation de java.time

Les autres réponses sont maintenant obsolètes. Les anciennes classes de date-heure problématiques (Date, Calendar, etc.) sont maintenant legacy, supplantées par les classes java.time.

LocalDate

La classe LocalDate représente une valeur de date uniquement, sans temps de jour et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'encore "hier" dans Montréal Québec.

Spécifiez un proper time zone name dans le format de continent/region, tels que America/Montreal, Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que EST ou IST car elles sont et non fuseaux horaires, non normalisés, et même pas uniques (!).

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

TemporalAdjuster

L'interface TemporalAdjuster permet de manipuler les valeurs date-heure. Les classes java.time utilisent des objets immuables, de sorte que le résultat est toujours un nouvel objet avec des valeurs basées sur l'original.

La classe TemporalAdjusters (nom pluriel de la note) fournit plusieurs implémentations pratiques. Parmi ceux-ci sont ceux pour obtenir ordinal jour de la semaine dans le mois: firstInMonth(), lastInMonth(), et dayOfWeekInMonth(). Tout ceci prend un argument d'un objet enum DayOfWeek.

LocalDate firstFridayOfThisMonth = 
    today.with(
     TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY) 
    ) 
; 

... et ...

LocalDate secondMondayOfThisMonth = 
    today.with(
     TemporalAdjusters.dayOfWeekInMonth(2 , DayOfWeek.MONDAY) 
    ) 
; 

... et ...

LocalDate thirdWednesdayOfNextMonth = 
    today.plusMonths(1) 
     .with( 
      TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.WEDNESDAY) 
     ) 
; 

A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les classes date de temps anciens legacy gênants tels que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

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

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

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

+0

@MoinuddinQuadri Je ferme très souvent des questions en tant que doublons, en particulier pour les questions de date-heure. Je vous invite à faire de même. Ce cas, cependant, n'est * pas * un doublon. Alors que ces deux partagent le sujet du jour-de-semaine ordinal dans le mois, ils ne sont pas les mêmes. L'autre question est pour Android. L'autre question implique de boucler et de collecter une série de dates. L'autre question implique 'EnumSet',' List', et 'YearMonth', dont aucun n'est mentionné ici. Cette réponse montre plusieurs TemporalAdjusters, l'autre, un seul. Je fais des copier-coller des morceaux de passe-partout, mais pas des réponses entières. –