2011-11-10 7 views
13

क्या डेटटाइम को सटीक घंटे, दिन या उससे भी कम करने के लिए कोई गणितीय तरीका है? दशमलव के लिए दशमलव के दौर के समान।कट-/एक डेटटाइम को पूरे दिन या दिन के लिए गोल करना?

Period.Day
यदि मूल मूल्य 2011-01-01 13:00:00 था, उस में समाप्त होता है 2011-01-01 00:00:00

अगर Period.Hour
यदि मूल मूल्य 2011-03-11 13:32:00 था, यह ऊपर 2011-03-11 13:00:00

में समाप्त होता है मैं के बारे में सोचना नीचे की तरह कुछ। यह निश्चित रूप से ठीक काम करता है, लेकिन बाद में range -एरे को फिर से चालू किया जाता है। बेहतर अगर मैं इसके बजाय इसके पुनरावृत्ति पर सीधे गणना करना संभव था। लेकिन कुछ टाइप को उस पुनरावृत्ति में नहीं रखा जा सकता है (यह कुछ प्रकार पर निर्भर करता है)।

if (someType == Period.Day) 
    range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day,0,0,0)); 
if (someType == Period.Hour) 
    range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day, d.time.Hour, 0, 0)); 
+1

आपका उदाहरण निकटतम दौर नहीं है।वे छिड़कते हैं/गोल करते हैं। – CodesInChaos

+0

'चयन करें 'के साथ' FOREach' को बदलें? –

+0

@CodeInChaos आप पूरी तरह से सही हैं। मैं शीर्षक बदल दूंगा क्योंकि यह मिसाइलिंग है। – Independent

उत्तर

14

एक दिन के लिए नीचे गोलाई time.Date के बराबर है, (अप मध्य पर) निकटतम करने के लिए गोलाई बस (time + 12hours).Date है।

एक पूर्ण घंटे तक घूमने के लिए मैं कोड के बारे में नहीं सोच सकता जो आपके से पढ़ने के लिए अच्छा है। निकटतम घंटे तक घूमने के लिए आप अपना कोड time + 30mins पर लागू कर सकते हैं।

शायद निकटतम घंटे के लिए गोलाई के लिए एक तेजी से विधि है:

const Int64 HourInTicks=...; 
Int64 timeInTicks=time.Ticks; 
Int64 trucatedToHour=timeInTicks-timeInTicks%HourInTicks; 

लेकिन मैं उस से बचने चाहते हैं, जब तक आप वास्तव में प्रदर्शन है, जो की संभावना नहीं है की जरूरत है।

+0

हां, यहां उन अच्छे उत्तरों के बीच बहुत छोटा प्रदर्शन अंतर। तो मैं अंत में सबसे अधिक पढ़ने योग्य और स्पष्ट तरीके से जाता हूं (क्योंकि कार्यक्षमता स्वयं थोड़ा अस्पष्ट है)। मैं foreach रखना लेकिन एक "cleardate (तिथि, अवधि)" के माध्यम से - डेटा स्रोत के बाद विधि और immedietly। जिसका मतलब है कि इस लूप द्वारा पूरी दिनचर्या पहले से ही की जा चुकी है। – Independent

12

आप DateTime.Date Property उपयोग कर सकते हैं दिन के लिए नीचे दौर के लिए (निकटतम मेरे दौर के दिनों में मुद्दों जहां स्थानीय समय परिवर्तन आप स्थानीय समय उपयोग कर रहे हैं ऑफसेट हो सकता है)।
घंटे के लिए नीचे दौर के लिए, मुझे डर है कि आप या तो करना होगा हूँ का उपयोग क्या आप अपने उदाहरण या कुछ और की तरह में किया था:

d.Date.AddHours(d.Hour) 
0

उत्तर Is there a better way in C# to round a DateTime to the nearest 5 seconds? एक उत्कृष्ट सामान्य DateTime गोलाई दृष्टिकोण होता है।

संपादित करें: यह जवाब था से पहले अद्यतन सवाल शीर्षक और निकटतम करने के लिए नहीं गोलाई नीचे गोलाई के लिए एक एल्गोरिथ्म है।

+0

ओह, मैंने उस पर देखा (और केवल स्वीकृत उत्तर)। मैट डब्ल्यू से एक अच्छी सुविधा। यह थोड़ा सा संशोधन के साथ पूरी तरह से मेरे प्रश्न को हल करता है। TimeSpan.FromTicks (एक्स) के साथ RoundOff। मुझे अवधि से टिक मिलती हैं। माह/अवधि। दिन और whola, कॉल सामान्य है! हालांकि यह मेरे अपने नमूने से कोई प्रदर्शन प्रदान नहीं करता है जो डबल पुनरावृत्ति करता है। विकास कभी-कभी इतनी अनियमित होती है .. :) – Independent

+0

आपका उत्तर ठीक है! – Independent

2

मैं निम्न कार्य करेंगे:

private static readonly DateTime Epoch = new DateTime(1970, 1, 1); 
public static DateTime Round(this DateTime d, Period p) 
{ 
    var ts = d - Epoch; 

    if (p == Period.Hour) 
    { 
     var hours = (long)ts.TotalHours; 
     return Epoch.AddHours(hours); 
    } 
    else if (p == Period.Days) 
    { 
     var days = (long)ts.TotalDays; 
     return Epoch.AddDays(days); 
    } 
    // ... 
} 
1

मेरा मानना ​​है कि निम्नलिखित सी # कोड निकटतम मिनट के लिए दिनांक समय मूल्य दौर होगा, और मुझे लगता है कि अन्य इकाइयों को पूर्णांक बनाना यह सामान्यीकरण करने के लिए आसान हो जाएगा।

//round to nearest minute; add 30 seconds for rounding to nearest minute 
effectiveDateTime = effectiveDateTime.AddSeconds(30); 
TimeSpan timeComponent = effectiveDateTime.TimeOfDay; 
effectiveDateTime = effectiveDateTime.Date; 
effectiveDateTime = effectiveDateTime.AddHours(timeComponent.Hours). 
    AddMinutes(timeComponent.Minutes); 
1

सुनिश्चित नहीं हैं कि अगर इस दृष्टिकोण प्रभावी है, लेकिन काफी स्ट्रिंग प्रारूप का उपयोग कर अच्छा लग रहा है (इस मामले घंटे के लिए नीचे काटने में):

var date = DateTime.UtcNow; 
var cutDownDate = Convert.ToDateTime(date.ToString("yyyy-MM-dd hh")); 
संबंधित मुद्दे