2010-10-08 6 views
2

Une date peut être formatée à l'aide d'un p. SimpleDateFormat (formatPattern, paramètres régionaux). Est-il en quelque sorte possible de déterminer la période (en secondes) qui est représentée par formatPattern donné une date? Par exemple. si nous avonsDétermination de l'intervalle de temps donné par un modèle

Date date = new Date(1286488800); 
String formatPattern = "yyyy"; 

est-il possible de déterminer la durée de l'année (en secondes) représenté par formatPattern et dans lequel se trouve ce jour?

+4

Je ne comprends pas vraiment ... ça ressemble à 8 octobre 2010 00:00 TU ... alors qu'est-ce qui serait nécessaire pour ce qui précède? 2010 ?, ou la longueur de 2010 en secondes? Autre? –

+3

Je suis peut-être juste fatigué mais pourriez-vous rendre la question plus claire? –

+0

Oui, la longueur de 2010 en secondes (mais c'est bien sûr juste un exemple). – user462982

Répondre

0

Je crois avoir trouvé une solution appropriée pour cela. Cela fonctionne pour moi, bien que je ne sois pas sûr et n'ai pas testé si cela fonctionne précisément dans toutes les situations (par exemple avec des secondes intercalaires). Si vous avez des suggestions d'amélioration, n'hésitez pas à les poster. Voici le code:

public long getIntervalTimeForFormat(String formatPattern, TimeZone timezone, Locale locale, Date inputDate){ 
    Date someOddestDate = new Date(1318352124368L); 
    GregorianCalendar calendar = new GregorianCalendar(); 
    calendar.setTime(someOddestDate); 
    GregorianCalendar calendarInput = new GregorianCalendar(); 
    calendarInput.setTime(inputDate); 
    Date reducedDate = null; 
try { 
    SimpleDateFormat formatter = new SimpleDateFormat(formatPattern, locale); 
    formatter.setTimeZone(timezone); 
    reducedDate = formatter.parse(formatter.format(someOddestDate)); 
} catch (ParseException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    GregorianCalendar reducedCalendar = new GregorianCalendar(); 
    reducedCalendar.setTime(reducedDate); 
    int maxField = 0; 
    int i = 14; 
// System.out.println("Reduced date is "+DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.GERMAN).format(reducedDate)+" - Oddest date is "+DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, Locale.GERMAN).format(someOddestDate)); 
    while(i > 0 && maxField == 0){ 
//  System.out.println("Reduced Field "+i+" is set "+reducedCalendar.isSet(i)+" and has value "+reducedCalendar.get(i)+" with actual maximum "+ reducedCalendar.getActualMaximum(i)+" and minimum "+reducedCalendar.getActualMinimum(i)+"-> "+reducedCalendar.getDisplayName(i, DateFormat.FULL, Locale.UK)); 
//  System.out.println("Oddest date Field "+i+" is set "+calendar.isSet(i)+" and has value "+calendar.get(i)+" with actual maximum "+ calendar.getActualMaximum(i)+" and minimum "+calendar.getActualMinimum(i)+"-> "+calendar.getDisplayName(i, DateFormat.FULL, Locale.UK)); 
     if(reducedCalendar.get(i) == calendar.get(i)){ 
//   System.out.println("-------> Field "+i+" is equal."); 
      maxField = i; 
     } 
     i--; 
    } 
    long valueInMillis = Long.MIN_VALUE; 
    switch(maxField){ 
    case 1: valueInMillis = calendarInput.getActualMaximum(6) * 24L * 60 * 60 * 1000; break;// current year granularity 
    case 2: valueInMillis = calendarInput.getActualMaximum(5) * 24L * 60 * 60 * 1000; break;// current month granularity 
    case 3: //week in month // we just want to know that the granularity is week here and don't care about partial weeks 
    case 4: valueInMillis = 7 * 24L * 60 * 60 * 1000; break; // week in year 
    case 5: //day granularity 
    case 6: 
    case 7: 
    case 8: valueInMillis = 24L * 60 * 60 * 1000; break; 
    case 9: valueInMillis = 12L * 60 * 60 * 1000; break; //half a day 
    case 10: //hour 
    case 11: valueInMillis = 60 * 60 * 1000; break; 
    case 12: valueInMillis = 60 * 1000; break; //minute 
    case 13: valueInMillis = 1000; break; //second 
    case 14: valueInMillis = 1; break; //millisecond 
    default: System.err.println("This should never happen."); 
    } 
// System.out.println("Returning "+valueInMillis); 
return valueInMillis; 

Il travaille essentiellement en comparant les champs de calandre d'un calendrier fixé à une date qui utilise tous les champs (oddestDate) avec un calendrier fixé à la même date, mais au format imprimé et analysé à nouveau par le formatPattern. Pour compenser au moins pour les années bissextiles, une entrée-date est également requise.

0

Je pense que l'utilisation d'un formatPattern pour détecter une plage de dates est une mauvaise chose. Vous devez écrire un analyseur pour le modèle de date. Une meilleure idée est d'utiliser une liste déroulante avec des gammes possibles (année, mois, semaine, etc.). Alors ce n'est pas un problème de calculer la longueur de la plage actuelle en secondes.

+0

L'écriture d'un analyseur est ce que je veux éviter et je pensais que peut-être le mécanisme de modèle pourrait être exploité. Dommage que cela ne semble pas possible :(De toute façon, merci à tous pour avoir partagé des idées sur ce sujet ... – user462982

Questions connexes