2012-01-19 36 views
7

Tôi muốn có thể làm tròn bất kỳ Instant nào cho Thời gian gần nhất thành nhóm hỗ trợ dữ liệu.Làm cách nào để làm tròn một DateTime thành Khoảng thời gian gần nhất

tức là ai đó có thể muốn nhóm theo khoảng thời gian 2 tuần, do đó, hãy cho một số Instant, tôi muốn có thể tìm ra ngay tức thì (trước hoặc sau) trên ranh giới thời gian mà "bây giờ" được coi là kết thúc của giai đoạn hiện tại. Nếu hôm nay là Thứ Ba, thì hãy xem xét rằng 2 Thời gian tuần này kết thúc tuần này. Cho bất kỳ ngày nào (từ giờ trở đi), tôi muốn muốn tính toán "Khoảng thời gian 2 tuần" mà nó phù hợp với.

// pseudo code 

Period sevenDays = Days.SEVEN; 

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

Period twelveHours = Hours.hours(12); 

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

Tôi hy vọng điều đó có ý nghĩa, bất kỳ trợ giúp hoặc gợi ý nào được đánh giá cao.

Trả lời

8

Ok, đây là một giải pháp mà tôi đã tự tạo ra nhưng tôi thực sự nghĩ rằng chức năng này nên được xây dựng trong Thời gian Joda.

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

Tốt, nhưng điều này chỉ hoạt động miễn là chính xác một trường của khoảng thời gian được sử dụng. Ví dụ, một khoảng thời gian 1m30s sẽ được làm tròn đến phút gần nhất. – Henning

Các vấn đề liên quan