2012-01-19 8 views
7

पर कैसे राउंड कर सकता हूं, मैं किसी भी दिए गए इंस्टेंट को निकटतम अवधि को डेटा के समर्थन समूह में स्थानांतरित करने में सक्षम होना चाहता हूं।मैं डेटटाइम को निकटतम अवधि

यानी किसी 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

ठीक है, यह एक समाधान है जिसे मैंने स्वयं बनाया लेकिन मुझे सच में लगता है कि यह कार्यक्षमता जोडा समय में बनाई जानी चाहिए।

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

संबंधित मुद्दे