(जी उठने के लिए क्षमा करें, मैं पहचान यह एक पुरानी है और सवाल का जवाब है - बस Google की खातिर के लिए कुछ अतिरिक्त कोड जोड़ने।)
मैं JayMcClellan's answer साथ शुरू किया था, लेकिन फिर मैं यह करने के लिए गोलाई, अधिक सामान्य बनना चाहता था मनमाने ढंग से अंतराल (केवल 5 सेकंड नहीं)। इसलिए मैंने जय की विधि को छोड़ दिया जो Math.Round
का उपयोग टिकों पर करता है और इसे एक विस्तार विधि में डाल देता है जो मनमाने ढंग से अंतराल ले सकता है और राउंडिंग लॉजिक (बैंकर के गोलाकार बनाम दूर-शून्य) को बदलने का विकल्प भी प्रदान करता है।मैं मामले में यहाँ पोस्टिंग कर रहा हूँ इस किसी और रूप में अच्छी तरह करने के लिए उपयोगी है:
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval, MidpointRounding roundingType) {
return new TimeSpan(
Convert.ToInt64(Math.Round(
time.Ticks/(decimal)roundingInterval.Ticks,
roundingType
)) * roundingInterval.Ticks
);
}
public static TimeSpan Round(this TimeSpan time, TimeSpan roundingInterval) {
return Round(time, roundingInterval, MidpointRounding.ToEven);
}
public static DateTime Round(this DateTime datetime, TimeSpan roundingInterval) {
return new DateTime((datetime - DateTime.MinValue).Round(roundingInterval).Ticks);
}
यह नंगे दक्षता के लिए किसी भी पुरस्कार जीतने नहीं होगा, लेकिन मैं इसे पढ़ने के लिए आसान है और उपयोग करने के लिए अच्छा संकेत मिले। उदाहरण उपयोग:
new DateTime(2010, 11, 4, 10, 28, 27).Round(TimeSpan.FromMinutes(1)); // rounds to 2010.11.04 10:28:00
new DateTime(2010, 11, 4, 13, 28, 27).Round(TimeSpan.FromDays(1)); // rounds to 2010.11.05 00:00
new TimeSpan(0, 2, 26).Round(TimeSpan.FromSeconds(5)); // rounds to 00:02:25
new TimeSpan(3, 34, 0).Round(TimeSpan.FromMinutes(37); // rounds to 03:42:00...for all your round-to-37-minute needs
स्रोत
2010-11-05 18:26:55
यह अच्छी तरह से काम करता है क्योंकि निकटतम 5 के लिए गोलाकार 59 सेकंड 60 उत्पन्न करेगा, जिसे आप डेटटाइम कन्स्ट्रक्टर को 'सेकेंड' पैरामीटर के रूप में पास नहीं कर सकते हैं। इस तरह आप उस गड़बड़ी से बचें। –
हाँ, यह एक अच्छा मुद्दा है - मुझे अपने कोड में उस समस्या को याद आया ... – Damovisa
मेरे अपने उत्तर की आलोचना करने के लिए एक संभावित गड़बड़ी यह है कि मुझे यकीन नहीं है कि डेटटाइम लीप-सेकेंड के लिए कैसे खाता है। टिक गणना 12:00:00 आधी रात, 1 जनवरी, 0001 से मापा जाता है। तो तब से लीप सेकंड की संख्या के आधार पर और क्या डेटटाइम उनके लिए खाता है, तो आप पाएंगे कि परिणामी सेकेंड मान 5 का एक बहु नहीं है। – JayMcClellan