मठों के बराबर।


369

दो तिथियों के बीच न्यूनतम (या अधिकतम) मान प्राप्त करने का सबसे तेज़ और आसान तरीका क्या है? क्या तारीखों के लिए Math.Min (& Math.Max) के बराबर है?

मैं कुछ ऐसा करना चाहता हूं:

 if (Math.Min(Date1, Date2) < MINIMUM_ALLOWED_DATE) {
      //not allowed to do this
 }

स्पष्ट रूप से उपरोक्त Math.Min काम नहीं करता है क्योंकि वे तिथियां हैं।

जवाबों:


416

दिनांक समय मानों के लिए कोई अधिभार नहीं है, लेकिन आप लंबे मान प्राप्त कर सकते हैं Ticksजो मान हैं, उनकी तुलना करें और फिर परिणाम से एक नया दिनांक समय मान बनाएँ:

new DateTime(Math.Min(Date1.Ticks, Date2.Ticks))

(ध्यान दें कि डेटटाइम संरचना में एक Kindसंपत्ति भी होती है , जिसे नए मूल्य में बनाए नहीं रखा जाता है। यह आमतौर पर कोई समस्या नहीं है। यदि आप डेटटाइम मूल्यों की तुलना विभिन्न प्रकार से करते हैं, तो तुलना किसी भी तरह से नहीं होती है।)


2
यह मुझे एक लाइन रिप्लेसमेंट / मैथ के लिए समकक्ष के बराबर लग रहा था। लेकिन अन्य उत्तर भी बहुत अच्छे थे, पूर्णता के लिए
— hawbsl

6
-, आप मूल जानकारी के (टिक को छोड़कर) हर जानकारी को पूरी तरह से ढीला कर System.DateTimeदेते हैं
— एंड्रियास

9
@AndreasNiedermair: यदि आप विभिन्न प्रकार की तारीखों की तुलना कर रहे हैं, तो आप सीधे उनकी तुलना वैसे भी नहीं कर सकते। मैंने पहले ही जवाब में इसे कवर किया।
— गुफ्फा

4
@ मुख्य: आप हमेशा उनकी तुलना कर सकते हैं, लेकिन यदि आप उन मूल्यों की तुलना करते हैं जो तुलनीय नहीं हैं, तो परिणाम बेकार है। यह किसी भी अन्य मूल्यों के साथ ठीक वैसा ही है, जो तुलनात्मक नहीं है, जैसे मील में दूरी के साथ किलोमीटर की दूरी की तुलना करना; आप मूल्यों की तुलना ठीक कर सकते हैं, लेकिन इसका कोई मतलब नहीं है।
— गुफ्फा

4
-1 के बारे में तरह तरह से हाथ मिलाने के लिए। जैसा कि @ user450 के उत्तर में दिखाया गया है, दोनों समयों को यूटीसी में परिवर्तित करना और सूचनाओं का त्याग किए बिना सुरक्षित रूप से तुलना करना काफी आसान है।
— पाइडर

484

ऐसा करने के लिए कोई विधि नहीं बनाई गई है। आप अभिव्यक्ति का उपयोग कर सकते हैं:

(date1 > date2 ? date1 : date2)

दो का अधिकतम पता लगाने के लिए।

आप गणना करने के लिए Minया Maxकिसी भी प्रकार के लिए एक सामान्य विधि लिख सकते हैं (बशर्ते कि Comparer<T>.Defaultयह उचित रूप से सेट हो):

public static T Max<T>(T first, T second) {
    if (Comparer<T>.Default.Compare(first, second) > 0)
        return first;
    return second;
}

आप LINQ का भी उपयोग कर सकते हैं:

new[]{date1, date2, date3}.Max()

15
यह वास्तव में उत्तर है जो स्वीकार किए जाने योग्य है।
— लैरी

38

कैसा रहेगा:

public static T Min<T>(params T[] values)
{
    if (values == null) throw new ArgumentNullException("values");
    var comparer = Comparer<T>.Default;
    switch(values.Length) {
        case 0: throw new ArgumentException();
        case 1: return values[0];
        case 2: return comparer.Compare(values[0],values[1]) < 0
               ? values[0] : values[1];
        default:
            T best = values[0];
            for (int i = 1; i < values.Length; i++)
            {
                if (comparer.Compare(values[i], best) < 0)
                {
                    best = values[i];
                }
            }
            return best;
    }        
}
// overload for the common "2" case...
public static T Min<T>(T x, T y)
{
    return Comparer<T>.Default.Compare(x, y) < 0 ? x : y;
}

किसी भी प्रकार के साथ काम करता है जो समर्थन करता है IComparable<T>या IComparable।

दरअसल, LINQ के साथ, एक और विकल्प है:

var min = new[] {x,y,z}.Min();

6
LINQ उदाहरण के लिए वोट करें।
— निर्दयी

20
public static class DateTool
{
    public static DateTime Min(DateTime x, DateTime y)
    {
        return (x.ToUniversalTime() < y.ToUniversalTime()) ? x : y;
    }
    public static DateTime Max(DateTime x, DateTime y)
    {
        return (x.ToUniversalTime() > y.ToUniversalTime()) ? x : y;
    }
}

यह तारीखों को अलग-अलग 'प्रकार' की अनुमति देता है और उस उदाहरण को लौटाता है जिसे पारित किया गया था (टिक्स या मिलिसकॉन्ड से निर्मित एक नई डेटाइम नहीं लौटाता)।

[TestMethod()]
    public void MinTest2()
    {
        DateTime x = new DateTime(2001, 1, 1, 1, 1, 2, DateTimeKind.Utc);
        DateTime y = new DateTime(2001, 1, 1, 1, 1, 1, DateTimeKind.Local);

        //Presumes Local TimeZone adjustment to UTC > 0
        DateTime actual = DateTool.Min(x, y);
        Assert.AreEqual(x, actual);
    }

ध्यान दें कि यह परीक्षण ग्रीनविच के पूर्व में विफल हो जाएगा ...


क्यों न केवल ToUniversalTime () भाग को गिरा दिया जाए?
— डेविड थिएलेन

18

Linq.Min()/ विकल्प Linq.Max():

DateTime date1 = new DateTime(2000,1,1);
DateTime date2 = new DateTime(2001,1,1);

DateTime minresult = new[] { date1,date2 }.Min();
DateTime maxresult = new[] { date1,date2 }.Max(); 

17

यदि आप इसे मैथ.मैक्स की तरह अधिक कॉल करना चाहते हैं, तो आप कुछ ऐसा कर सकते हैं जैसे कि बहुत ही कम अभिव्यक्ति वाला शरीर:

public static DateTime Max(params DateTime[] dates) => dates.Max();
[...]
var lastUpdatedTime = DateMath.Max(feedItemDateTime, assemblyUpdatedDateTime);

ओह, यह प्रतिभाशाली है! इस तरह से मुझे डेटा के साथ काम करने के एक समय बाद, हर बार तुलना नहीं करनी है। आपका बहुत बहुत धन्यवाद!
— tfrascaroli

यह एक बहुत ही सुंदर समाधान है
— pberggreen

2

कैसे एक DateTimeविस्तार विधि के बारे में ?

public static DateTime MaxOf(this DateTime instance, DateTime dateTime)
{
    return instance > dateTime ? instance : dateTime;
}

उपयोग:

var maxDate = date1.MaxOf(date2);

मैं इसका उपयोग करना पसंद करूंगा DateTime.MaxOf(dt1, dt2), लेकिन मुझे नहीं पता कि यह कैसे करना है ...
— Zach Smith

@ZachSmith आप DateTime क्लास को ओवरलोड नहीं कर सकते क्योंकि यह आंशिक नहीं है। शायद हम DateTimeHelper.Max (dt1, dt2) का उपयोग कर सकते हैं
— shtse8

@ shtse8 - ओवरलोडिंग से आपका क्या मतलब है? मैं एक विस्तार विधि जोड़ने के बारे में सोच रहा था। लेकिन तब से सीखा है कि एक त्वरित उदाहरण के बिना नहीं किया जा सकता है। लगता है जैसे आप कह रहे हैं कि एक विस्तार विधि जोड़ना ओवरलोडिंग का एक रूप है? मैंने कभी नहीं माना कि .. क्या यह सही है? अब जब मैं इसके बारे में सोचता हूं ... तो वास्तव में ओवरलोडिंग का क्या मतलब है?
— Zach Smith

@ZachSmith ओह, मैंने सोचा कि आप "DateTime.MaxOf (dt1, dt2)" नामक एक एक्सटेंशन को "DateTime.Now" की तरह जोड़ रहे हैं, जो DateTime स्थिर सदस्यों पर आधारित है।
— shtse8

-2

अब जब हमारे पास LINQ है, तो आप अपने दो मूल्यों (DateTimes, TimeSpans, जो भी हो) के साथ एक सरणी बना सकते हैं और फिर .Max () एक्सटेंशन विधि का उपयोग कर सकते हैं।

var values = new[] { Date1, Date2 }; 
var max = values.Max(); 

यह अच्छा है, यह अधिकतम के रूप में कुशल हो सकता है, और यह तुलना के 2 से अधिक मूल्यों के लिए पुन: प्रयोज्य है।

नीचे पूरी समस्या के बारे में चिंता करना। हिंद एक बड़ी बात है ... लेकिन मैं इससे बचता हूं कि कभी स्थानीय समय में काम करने से, कभी। यदि मेरे पास समय के बारे में कुछ महत्वपूर्ण है, तो मैं हमेशा यूटीसी में काम करता हूं, भले ही इसका मतलब वहां काम करने के लिए अधिक हो।


1
मेरे उत्तर की प्रति
— तोशी

-3
// Two different dates
var date1 = new Date(2013, 05, 13); 
var date2 = new Date(2013, 04, 10) ;
// convert both dates in milliseconds and use Math.min function
var minDate = Math.min(date1.valueOf(), date2.valueOf());
// convert minDate to Date
var date = new Date(minDate); 

http://jsfiddle.net/5CR37/


अच्छा सुझाव (वास्तव में), लेकिन विवरण के बिना यह पता लगाना कठिन है कि यह अच्छा क्यों है। कृपया वर्णन करें कि चाल कहाँ है। विवरण के बिना यह सिर्फ कोड का एक ब्लॉक है और उत्तर नहीं है।
— आर्टेमिक्स

3
प्रश्न को टैग किया गया है। .NET नहीं जावास्क्रिप्ट
— hwbsl

क्षमा करें, .NET को नोटिस नहीं किया। वैसे भी, हम ग्राहक की ओर से मिनट की तारीख पा सकते हैं और इसे सर्वर पर भेज सकते हैं।
— सेर्गेई सुवोरोव

4
आप मानते हैं कि हम एस्प के बारे में बात कर रहे हैं, जो जरूरी नहीं कि सही हो। यह क्लाइंट पर अंतर को शांत करने के लिए काफी बेवकूफी होगी, क्योंकि इसमें अधिक जोखिम (जावास्क्रिप्ट अक्षम) हैं, यह अनावश्यक ट्रैफ़िक उत्पन्न करेगा और यह (नेटवर्क स्पीड के आधार पर) धीमा होगा
— jalgames
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.