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.
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? –
Je suis peut-être juste fatigué mais pourriez-vous rendre la question plus claire? –
Oui, la longueur de 2010 en secondes (mais c'est bien sûr juste un exemple). – user462982