2012-01-19 184 views
7

我希望能夠將任何給定的即時調整到最近的時間段爲 支持數據分組。如何將日期時間四捨五入爲最接近的時間段

即有人可能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

相關問題