2012-01-19 9 views
7

データのグループ化をサポートする最も近いピリオドに任意のインスタントを丸めることができます。DateTimeを最も近いピリオドに丸める方法

つまり、誰かが2週間の期間でグループ化したい場合は、 インスタントを指定すると、「今」とみなされる期間の境界で最も近いインスタント(前または )を取り除くことができます現在の期間の最後の 。今日が火曜日ならば、この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

これは私が自分で作った1つの解決策ですが、この機能は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つのフィールドが使用されている限り動作します。たとえば、1分30秒は最も近い分に丸められます。 – Henning

関連する問題