2010-08-30 4 views
5

Je récupère des données d'une base de données qui a une valeur de date stockée, et je laisse l'utilisateur choisir les plages de dates pour lesquelles il souhaite voir les données. Tout mon code pour obtenir ces plages de dates fonctionne à l'exception de la méthode pour obtenir la plage de dates couvrant tout le temps, qui serait une valeur initiale des premières données Java manipulées, à la valeur finale de la date maximale possible.Java: Min et Max Plage de dates

Y at-il quelque chose de mal avec mon code, parce que je ne vois pas un problème:

public static DateRange getAllTime() { 
     /** 
     * Get earliest possible 
     */ 
     Calendar c = Calendar.getInstance(); 
     c.set(
       c.getActualMinimum(Calendar.YEAR), 
       c.getActualMinimum(Calendar.MONTH), 
       c.getActualMinimum(Calendar.DAY_OF_MONTH), 
       c.getActualMinimum(Calendar.HOUR), 
       c.getActualMinimum(Calendar.MINUTE), 
       c.getActualMinimum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND)); 
     Date start = c.getTime(); 

     /** 
     * Get latest possible date 
     */ 
     c.set(
       c.getActualMaximum(Calendar.YEAR), 
       c.getActualMaximum(Calendar.MONTH), 
       c.getActualMaximum(Calendar.DAY_OF_MONTH), 
       c.getActualMaximum(Calendar.HOUR), 
       c.getActualMaximum(Calendar.MINUTE), 
       c.getActualMaximum(Calendar.SECOND) 
      ); 

     c.set(Calendar.MILLISECOND, c.getActualMaximum(Calendar.MILLISECOND)); 
     Date end = c.getTime(); 

     DateRange range = new DateRange(); 
     range.Start = start; 
     range.End = end; 

     return range; 
    } 
+0

Que retourne votre méthode? –

Répondre

4

Pourquoi rendre la vie si compliquée? Si vous n'avez pas de date de début, ne demandez pas de date de début. Si vous n'avez pas de date de fin, ne demandez pas de date de fin. Et si vous n'avez ni l'un ni l'autre, ne demandez pas de dates du tout.

+0

Haha ouais, c'est ce que j'ai fini par faire. C'était un cas spécial, et puisque chaque autre cas avait un début/fin, je viens d'utiliser une méthode. Terminé en écrivant une méthode pour couvrir ce cas et écrit une requête qui n'a pas vérifié la date. Cela dit, ça me dérange de ne pas savoir et j'aimerais vraiment savoir pourquoi cela ne fonctionnait pas. –

0

Ce code me fonctionne, peut-être que vous n'attendez pas les valeurs qu'il renvoie?

Début: Sam 1 janvier 00:00:00 PST 1 Fin: Mer 17 avril 21:34:08 PST 292269054

(Il serait plus facile d'aider si vous avez inclus la trace de la pile)

17

Pourquoi ne pas utiliser

  1. new date (Long.MIN_VALUE) (en AN 292269055 BC)
  2. new date (Long.MAX_VALUE) (en AN 292278994 AD)?

Depuis froginvasion a contesté la réponse, je pensais que je double le vérifier

long day=1000*60*60*24; 
    System.out.println(new Date(Long.MAX_VALUE-day)); 
    System.out.println(new Date(Long.MAX_VALUE)); 
    System.out.println(new Date(0)); 
    System.out.println(new Date(-day)); 
    System.out.println(new Date(Long.MIN_VALUE)); 
    System.out.println(new Date(Long.MIN_VALUE+day)); 

m'a donné

Sat Aug 16 07:12:55 GMT 292278994 
Sun Aug 17 07:12:55 GMT 292278994 
Thu Jan 01 00:00:00 GMT 1970 
Wed Dec 31 00:00:00 GMT 1969 
Sun Dec 02 16:47:04 GMT 292269055 
Mon Dec 03 16:47:04 GMT 292269055 

Je pense qu'il est juste. Je suppose que les AD/BC sont juste supprimés. La suggestion d'utiliser la nouvelle date (0) comme minimum est clairement fausse, car la nouvelle date (jour) est nettement plus petite.

+0

Solution simple et élégante! – nobre

+0

D'accord, très bon à utiliser Les valeurs statiques pour cela! +1 – will824

+1

'new Date (Long.MIN_VALUE)' ne fonctionnera pas, testez-le.Il ne fait pas vraiment quelque chose que vous attendez. Si vous voulez utiliser ceci, utilisez 'new Date (0)' qui est le 1er janvier 1970. – froginvasion

0

Je suspecte un débordement en réglant l'année puis en définissant des valeurs maximales pour tous les autres champs séparément. Cela ferait en sorte que votre heure de fin soit quelque part autour de votre heure de début et que tous les enregistrements soient rejetés. Vous pourriez essayer d'imprimer les heures du calendrier pour voir ce qui se passe. Comme le souligne seanizer, vous compliquez énormément les choses - la meilleure façon de gérer cela est de laisser la clause de date complètement vide dans la requête. Cela peut parfois être difficile car l'instruction sql n'est pas générée dynamiquement. Mais notez que même si vous ne pouvez pas modifier le SQL au moment de l'exécution, la condition (Oracle)

start_date >= nvl(?, start_date) 

sera toujours satisfaite si la valeur fournie est nulle et start_date est rempli.