2012-07-06 16 views
13

मैं उचित गोल करने की व्यवस्था की तलाश में हूं लेकिन मुझे लगता है कि मुझे जो कुछ भी चाहिए वह बिल्कुल ठीक नहीं लगता है।डेटटाइम राउंड अप और डाउन

मुझे अलग-अलग गोल करने और गोल करने की आवश्यकता है और मुझे पहले से ही गोल होने पर मामले के लिए भी खाते की आवश्यकता है।

मैं निम्नलिखित राउंडिंग की जरूरत स्पष्ट रूप से निकटतम 10 मिनट होने

5:00 -> RoundDown() -> 5:00 
5:04 -> RoundDown() -> 5:00 
5:09 -> RoundDown() -> 5:00 
5:10 -> RoundDown() -> 5:10 

4:00 -> RoundUp() -> 4:00 
4:50 -> RoundUp() -> 4:50 
4:51 -> RoundUp() -> 5:00 
4:56 -> RoundUp() -> 5:00 

मूल रूप से मैं इसे राउंडअप() या ROUNDDOWN (की जरूरत है) लेकिन यह भी समय अछूता छोड़ देना चाहिए कि वह पहले से एक से अधिक में है 10 मिनट का। > 04:50:00 - -> राउंडअप() -> 4:50

करता है इसके अलावा, मैं वे राउंडिंग प्रक्रिया पर कोई प्रभाव नहीं

4:50:45 है के लिए किसी भी सेकंड काट-छांट करना चाहते हैं किसी को भी इसे पूरा करने के लिए कोई आसान कोड है।

मुझे यह कोड कहीं और मिला लेकिन यह 5:00 राउंडअप() -> 5:10 को बरकरार रखने के बजाए गोल करता है क्योंकि यह पहले से ही 10 में से एक है और उसे गोल करने की आवश्यकता नहीं है। इसके अलावा मुझे यकीन नहीं है कि

public static DateTime RoundDateTime(this DateTime dt, int minutes, RoundingDirection direction) 
{ 
    TimeSpan t; 
    switch (direction) 
    { 
     case RoundingDirection.Up: 
      t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes, 0)); break; 
     case RoundingDirection.Down: 
      t = (dt.Subtract(DateTime.MinValue)); break; 
     default: 
      t = (dt.Subtract(DateTime.MinValue)).Add(new TimeSpan(0, minutes/2, 0)); break; 
    } 
    return DateTime.MinValue.Add(new TimeSpan(0, 
      (((int)t.TotalMinutes)/minutes) * minutes, 0)); 
} 

आशा है कि कोई व्यक्ति मेरे लिए यह काम करने के लिए उस विधि को संपादित कर सकता है। धन्यवाद

+3

ठीक है। तो आपके पास वहां कोडिंग कोड है। आप ऐसा करने के लिए इसे क्यों संशोधित नहीं कर रहे हैं जो आपको करने की ज़रूरत है? –

+3

क्या यह काम करेगा? http://stackoverflow.com/questions/7029353/c-sharp-round-up-time-to-nearest-x-minutes – comecme

+0

आपका राउंडिंग नियम अस्पष्ट है। आप 5:09 से 5:00 बजे तक 4:56 से 5:00 बजे तक जाते हैं। – Rawling

उत्तर

11

कैसे के बारे में:

case RoundingDirection.Up: 
    t = dt.AddMinutes((60 - dt.Minute) % 10); 
case RoundingDirection.Down: 
    t = dt.AddMinutes(-dt.Minute % 10); 

डेमो: http://ideone.com/AlB7Q

+1

क्या यह सेकंड का ख्याल रखता है? – comecme

+0

@comecme: newp। – mellamokb

27

यह आपको दौर को देखते हुए किसी भी अंतराल के अनुसार करने देगा।

private static DateTime Floor(DateTime dateTime, TimeSpan interval) 
{ 
    return dateTime.AddTicks(-(dateTime.Ticks % interval.Ticks)); 
} 

private static DateTime Ceiling(DateTime dateTime, TimeSpan interval) 
{ 
    var overflow = dateTime.Ticks % interval.Ticks; 

    return overflow == 0 ? dateTime : dateTime.AddTicks(interval.Ticks - overflow); 
} 

private static DateTime Round(DateTime dateTime, TimeSpan interval) 
{ 
    var halfIntervelTicks = ((interval.Ticks + 1) >> 1); 

    return dateTime.AddTicks(halfIntervelTicks - ((dateTime.Ticks + halfIntervelTicks) % interval.Ticks)); 
} 

सेकंड छोटा की देखभाल करने के लिए, मैं बस उन्हें राउंडिंग कार्यों में भेजने से पहले की तारीख समय से सेकंड और मिलीसेकेंड घटाना होगा।

0

यहाँ काटना (नीचे दौर)

var now = DateTime.Now; 
var nowTicks = now.Ticks; 

//removing the nanoseconds, miliseconds, and seconds from the nowTicks 
var lastMinute = new DateTime(nowTicks - (nowTicks % (1000*1000*10*60))); 
0

इस समारोह निकटतम अंतराल (मिनट) के लिए ऊपर या नीचे दौर होगा एक तेजी से रास्ता है।

private static DateTime NormalizeReadingInterval(DateTime originalTime, int interval) 
    { 
     if (originalTime.Minute % interval == 0) return originalTime; 
     var epochTime = new DateTime(1900, 1, 1); 
     var minutes = (originalTime - epochTime).TotalMinutes; 
     var numIntervals = minutes/interval; 
     var roundedNumIntervals = Math.Round(numIntervals, 0); 
     return epochTime.AddMinutes(roundedNumIntervals * interval); 
    } 
संबंधित मुद्दे