2010-10-08 3 views
2

Дата может быть отформатирована с использованием, например, SimpleDateFormat (formatPattern, locale). Возможно ли определить период времени (в секундах), который представлен formatPattern с датой? Например. если мы имеемОпределение временного интервала, заданного шаблоном

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

возможно определить длину года (в секундах), представленного formatPattern и в какой день лежит?

+4

Я не совсем понял ... это выглядит как 8 октября 2010 00:00 UT ... так что потребуется для вышеперечисленного? 2010 ?, или продолжительность 2010 в секундах? Другие? –

+3

Я, возможно, просто устал, но не мог бы вы сделать вопрос понятнее? –

+0

Да, длина 2010 в секундах (но это, конечно, просто пример). – user462982

ответ

0

Я считаю, что нашел подходящее решение для этого. Он работает для меня, хотя я не уверен и не проверял, работает ли это точно во всех ситуациях (например, с секунд прыжка). Если у вас есть предложения по улучшению, не стесняйтесь публиковать их. Вот код:

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; 

Это в основном работает путем сравнения каландра полого календаря, установленный на дату, которая использует все поля (oddestDate) с календарем, установленный на ту же дату, но отформатированный, распечатана и снова разобран в форматеPattern. Чтобы компенсировать, по крайней мере, високосные годы, требуется также inputDate.

0

Я думаю, что использовать форматPattern для определения диапазона дат - это плохо. Вам нужно написать парсер для шаблона даты. Лучше всего использовать раскрывающийся список с возможными диапазонами (год, месяц, неделя и т. Д.). Тогда не проблема рассчитать длину текущего диапазона в секундах.

+0

Написание парсера - это то, что я хочу избежать, и подумал, что, возможно, механизм шаблонов можно каким-то образом использовать. Жаль, что это не представляется возможным :(В любом случае, спасибо всем за то, что поделились мыслями об этом ... – user462982

Смежные вопросы