2009-03-05 11 views
2

Je veux avoir des objets qui définissent des dates/heures partielles similaires aux entrées de crontabs Unix, i. e. "Tous les premiers jours d'un mois", etc.Objets du calendrier de correspondance dans Java?

Ces objets seront comparés aux objets Calendar pour voir s'ils correspondent. J'étais sur le point d'écrire ma propre classe "TimePattern", mais elle devrait contenir beaucoup de logique comme vérifier si les valeurs de champ étaient dans les limites légales (heure entre 0 et 23 etc.) que je pensais être dans les classes comme Calendrier quand même. Donc, maintenant j'utilise simplement un objet Calendar (non élastique) avec des champs non définis et je veux les comparer avec des objets Calendar complètement définis qui représentent un point fixe dans le temps. Dois-je

  • écrire ma propre méthode qui passe par les champs pertinents et contrôles pour « égale ou unset »
  • étendent un (grégorien) classe calendrier pour contenir une méthode « matchWith »
  • utilisation d'un mécanisme de comparaison c'est déjà là (dans la classe Calendrier), mais que j'ai oublié jusqu'ici
+0

Je me demande si quelque chose en JodaTime aiderait à cette ... – JeeBee

+0

vous pouvez vérifier comment traite l'intégration de quartz dans la classe utilitaire printemps CronTriggerBean avec ce problème: http : //tinyurl.com/bwo2n6 –

Répondre

0

Vous pouvez créer un ensemble de Comparateurs - MinuteMatch, HourMatch, etc, et les utiliser pour comparer les deux dates?

1

Une solution que j'ai utilisée dans le passé est d'écrire un format DateFormat qui mettra en forme les dates avec seulement les champs que vous voulez, puis comparez les chaînes résultantes. Par exemple, il est fréquent de ne pas se soucier de la composante temporelle, seules les dates, vous pourriez faire quelque chose comme ceci:

public boolean sameDate(Calendar c1, Calendar c2) 
{ 
    DateFormat datesOnly = new SimpleDateFormat("yyyy-MM-dd"); 
    return datesOnly.format(c1.getTime()).equals(datesOnly.format(c2.getTime())); 
} 

Il est probablement pas la meilleure mise en œuvre si vous allez créer une nouvelle bibliothèque mais fonctionne plutôt bien pour d'autres cas.

+0

Modifiez SimpleDateFormatter qui n'existe pas dans SimpleDateFormat (Je n'ai pas les droits de modification suffisants pour le faire moi-même, et le changement nécessite au moins 6 caractères pour être révisé par les pairs.) – Roalt

0

Est-ce que Google's RFC-2445 serait utile? C'est une calculatrice de récurrence des dates qui vous permet de faire facilement la sémantique "premier lundi de chaque troisième mois".

0

C'est ce que je l'ai finalement:

public class CalendarMatch<T extends Calendar> { 
    private T _dt; 

    public CalendarMatch(T dt) { 
     this._dt = dt; 
    } 

    public boolean fMatches(T dtCmp) 
    { 
     int[] rgChecks = { 
          Calendar.HOUR_OF_DAY, 
          Calendar.MINUTE, 
          Calendar.SECOND, 
          Calendar.DAY_OF_MONTH, 
          Calendar.MONTH, 
          Calendar.YEAR, 
          Calendar.DAY_OF_WEEK 
         }; 
     for (int ixField : rgChecks) { 
      // if any field in our partial date is set 
      // but does not equal its counterpart, it's not a match 
      if (this._dt.isSet(ixField) && dtCmp.get(ixField) != this._dt.get(ixField)) { 
       return false; 
      } 
     } 
     // otherwise, it is 
     return true; 
    } 
} 
+0

En quoi est-ce différent? , ou mieux, que la méthode Calendar.equals (Calender) par défaut? – banjollity

+0

Calendar.equals est beaucoup plus strict et ne gère pas les unset champs comme je le voudrais. Voir aussi: http://java.sun.com/javase/6/docs/api/java/util/Calendar.html#equals(java.lang.Object) Je ne cherche pas vraiment l'égalité date, mais pour celui qui correspond à mon "modèle", ou une date partielle. –