2012-01-19 5 views
7

가장 가까운 기간에 주어진 인스턴트를 데이터 그룹화 지원으로 반올림하고 싶습니다.DateTime을 가장 가까운 기간으로 반올림하는 방법

즉, 누군가가 2 주 단위로 그룹화하려는 경우 인스턴트가 주어지면 "지금"으로 간주되는 기간 경계에서 가장 가까운 인스턴트 (이전 또는 이후)를 해결할 수 있기를 원합니다. 현재 기간의 끝 . 오늘이 화요일이면이 주일이 끝나는 것을 고려하십시오. 어떤 날짜 (지금부터 뒤로)가 주어지면 은 "2 주 기간"을 계산하는 것과 같습니다.

// pseudo code 

Period sevenDays = Days.SEVEN; 

Instant nearestWeek = sevenDays.roundToNearest(new DateTime()); 

Period twelveHours = Hours.hours(12); 

Instant nearestHalfDay = twelveHours.roundToNearest(new DateTime()); 

나는 도움이 되었으면 좋겠다.

답변

8

좋아,이 솔루션은 나 자신을 만들었지 만이 기능은 Joda Time에 내장되어야한다고 생각합니다.

public static DateTime dateTimeFloor(DateTime dt, Period p) { 
    if (p.getYears() != 0) { 
     return dt.yearOfEra().roundFloorCopy().minusYears(dt.getYearOfEra() % p.getYears()); 
    } else if (p.getMonths() != 0) { 
     return dt.monthOfYear().roundFloorCopy().minusMonths((dt.getMonthOfYear() - 1) % p.getMonths()); 
    } else if (p.getWeeks() != 0) { 
     return dt.weekOfWeekyear().roundFloorCopy().minusWeeks((dt.getWeekOfWeekyear() - 1) % p.getWeeks()); 
    } else if (p.getDays() != 0) { 
     return dt.dayOfMonth().roundFloorCopy().minusDays((dt.getDayOfMonth() - 1) % p.getDays()); 
    } else if (p.getHours() != 0) { 
     return dt.hourOfDay().roundFloorCopy().minusHours(dt.getHourOfDay() % p.getHours()); 
    } else if (p.getMinutes() != 0) { 
     return dt.minuteOfHour().roundFloorCopy().minusMinutes(dt.getMinuteOfHour() % p.getMinutes()); 
    } else if (p.getSeconds() != 0) { 
     return dt.secondOfMinute().roundFloorCopy().minusSeconds(dt.getSecondOfMinute() % p.getSeconds()); 
    } 
    return dt.millisOfSecond().roundCeilingCopy().minusMillis(dt.getMillisOfSecond() % p.getMillis()); 
} 
+0

니스이지만이 기간은 정확하게 한 마디의 필드가 사용되는 한 작동합니다. 예를 들어, 1 분 30 초의 기간은 가장 가까운 분으로 반올림됩니다. – Henning

관련 문제