তারিখগুলির জন্য ম্যাথ.মিন এবং ম্যাথ.ম্যাক্সের সমান?


369

দুটি তারিখের মধ্যে সর্বনিম্ন (বা সর্বোচ্চ) মান পাওয়ার দ্রুত ও সহজ উপায় কী? তারিখের জন্য ম্যাথ.মিনের (এবং ম্যাথ.ম্যাক্স) সমতুল্য কি আছে?

আমি এরকম কিছু করতে চাই:

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

স্পষ্টত উপরের ম্যাথ.মিন কাজ করে না কারণ তারা তারিখ।

উত্তর:


416

ডেটটাইম মানগুলির জন্য কোনও ওভারলোড নেই, তবে আপনি মানগুলি Ticksযে লম্বা মান ধারণ করে তা তুলনা করতে পারেন এবং তারপরে ফলাফল থেকে একটি নতুন ডেটটাইম মান তৈরি করতে পারেন:

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

(দ্রষ্টব্য যে ডেটটাইম কাঠামোতেও একটি Kindসম্পত্তি রয়েছে , এটি নতুন মান ধরে রাখা হয় না This এটি সাধারণত কোনও সমস্যা নয়; আপনি যদি বিভিন্ন ধরণের ডেটটাইম মানগুলি তুলনা করেন তবে তা তুলনাটি কোনওভাবেই বোঝা যায় না))


2
এটি আমার কাছে মনে হয়েছিল ম্যাথের এক লাইনের প্রতিস্থাপন / সমমানের নিকটতম, তবে অন্যান্য উত্তরগুলিও দুর্দান্ত ছিল, সম্পূর্ণতার জন্য
hawbsl

6
-, আপনি মূল System.DateTimeতথ্যটির সমস্ত তথ্য ( টিকটিকাগুলি ব্যতীত) সম্পূর্ণভাবে আলগা করে রেখেছেন
আন্দ্রেস

9
@ আন্ড্রেসনিডেরমায়ার: আপনি যদি বিভিন্ন ধরণের তারিখের তুলনা করেন তবে আপনি কেবল সেগুলি সরাসরি কোনওভাবেই তুলনা করতে পারবেন না। আমি ইতিমধ্যে উত্তরে এটি আবরণ।
গুফা

4
@ আইইন: আপনি সর্বদা সেগুলি তুলনা করতে পারেন , তবে আপনি যদি তুলনামূলক নয় এমন মানগুলি তুলনা করেন তবে ফলাফলটি অকেজো। এটি অন্য যে কোনও মূল্যবোধের সাথে তুলনামূলক নয় যেমন মাইলের সাথে একটি দূরত্বের সাথে কিলোমিটারের সাথে একটি দূরত্বকে তুলনা করে; আপনি মানগুলি ঠিকঠাক তুলনা করতে পারেন, তবে এর কোনও অর্থ নেই।
গুফা

4
ধরণ সম্পর্কে হ্যান্ডওয়েংয়ের জন্য -1। @ ইউজার ৪'০ এর উত্তরে যেমন দেখানো হয়েছে, উভয় সময়কে ইউটিসিতে রূপান্তর করা এবং তথ্য বাদ না দিয়ে নিরাপদে তাদের তুলনা করা বেশ সহজ।
পিয়াদার

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;
}

আপনি লিনকিউও ব্যবহার করতে পারেন:

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

আসলে, লিনকিউ সহ, অন্য একটি বিকল্প হ'ল:

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

6
লিনকু উদাহরণের জন্য ভোট দিন।
অবিরাম

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)চাই, তবে আমি কীভাবে এটি করব তা জানি না ...
জাচ স্মিথ

@ জ্যাচস্মিথ আপনি ডেটটাইম ক্লাসটি ওভারলোড করতে পারবেন না কারণ এটি আংশিক নয়। হতে পারে আমরা ডেটটাইমহেল্পার.ম্যাক্স (ডিটি 1, ডিটি 2)
shtse8

@ shtse8 - ওভারলোডিং বলতে কী বোঝ? আমি একটি এক্সটেনশন পদ্ধতি যুক্ত করার কথা ভাবছিলাম। তবে তখন থেকে শিখেছি যা তাত্ক্ষণিক উদাহরণ ছাড়া করা যায় না। আপনি কি বলছেন যে কোনও এক্সটেনশন পদ্ধতি যুক্ত করা ওভারলোডিংয়ের একটি রূপ? আমি কখনই তা বিবেচনা করি নি .. এটা কি সঠিক? এখন যে আমি এটি সম্পর্কে চিন্তা করি ... ওভারলোডিং এর অর্থ কী?
জাচ স্মিথ

@ জাকস্মিথ ওহ, আমি ভেবেছিলাম আপনি ডেটটাইম স্ট্যাটিক সদস্যদের উপর ভিত্তি করে "ডেটটাইম.নাউ" এর মতো "ডেটটাইম.ম্যাক্সঅফ (ডিটি 1, ডিটি 2)" নামে একটি এক্সটেনশন যুক্ত করছেন।
shtse8

-2

এখন আমাদের কাছে লিনকিউ রয়েছে, আপনি আপনার দুটি মান (ডেটটাইমস, টাইমস্প্যানস, যাই হোক না কেন) দিয়ে একটি অ্যারে তৈরি করতে পারেন এবং তারপরে .ম্যাক্স () এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন।

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

এটি দুর্দান্ত পড়েছে, এটি ম্যাক্সের মতো দক্ষ এবং এটি তুলনার 2 টিরও বেশি মানের জন্য পুনরায় ব্যবহারযোগ্য।

নীচের পুরো সমস্যাটি উদ্বিগ্ন K সময় সম্পর্কে আমার যদি কিছু গুরুত্বপূর্ণ থাকে তবে আমি সর্বদা ইউটিসি-তে কাজ করি, এমনকি সেখানে পৌঁছানোর আরও বেশি কাজের অর্থ হলেও।


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
প্রশ্ন ট্যাগ করা আছে। জাভাস্ক্রিপ্ট নয়
hwbsl

দুঃখিত, লক্ষ্য করেনি। নেট। যাইহোক, আমরা ক্লায়েন্ট পক্ষের ন্যূনতম তারিখটি খুঁজে পেতে এবং এটি সার্ভারে প্রেরণ করতে পারি।
সের্গেই সুভোরভ

4
আপনি ধরে নিন যে আমরা আস্প সম্পর্কে কথা বলছি, যা অগত্যা সঠিক নয়। ক্লায়েন্টের মধ্যে পার্থক্যটি কল্পনা করতে এটি বেশ বোকা হবে, কারণ আরও অনেক ঝুঁকি রয়েছে (জাভাস্ক্রিপ্ট অক্ষম), এটি অপ্রয়োজনীয় ট্রাফিক তৈরি করবে এবং এটি (নেটওয়ার্কের গতির উপর নির্ভর করে) ধীর হবে
জলগেমগুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.