অ্যাডবসনেসডয়েস এবং গেটব্যাসনেসডয়েস


94

আমার 2 মার্জিত সম্পূর্ণ বাস্তবায়ন খুঁজে পাওয়া দরকার

public static DateTime AddBusinessDays(this DateTime date, int days)
{
 // code here
}

and 

public static int GetBusinessDays(this DateTime start, DateTime end)
{
 // code here
}

ও (1) ভাল (কোন লুপ নেই)।

সম্পাদনা: ব্যবসায়ের দিনগুলি বলতে বোঝায় কাজের দিনগুলি (সোমবার, মঙ্গলবার, বুধবার, বৃহস্পতিবার, শুক্রবার)। কোনও ছুটি নেই, কেবল সপ্তাহান্তে বাদ নেই।

আমার কাছে ইতিমধ্যে কিছু কুরুচিপূর্ণ সমাধান রয়েছে যা কাজ করে মনে হচ্ছে তবে আমি আশ্চর্য হয়েছি যে এটি করার জন্য দুর্দান্ত উপায় আছে কিনা। ধন্যবাদ


এটি আমি এ পর্যন্ত লিখেছি। এটি সব ক্ষেত্রেই কাজ করে এবং নেতিবাচকও করে। এখনও একটি getBusinessDays বাস্তবায়ন প্রয়োজন

public static DateTime AddBusinessDays(this DateTime startDate,
                                         int businessDays)
{
    int direction = Math.Sign(businessDays);
    if(direction == 1)
    {
        if(startDate.DayOfWeek == DayOfWeek.Saturday)
        {
            startDate = startDate.AddDays(2);
            businessDays = businessDays - 1;
        }
        else if(startDate.DayOfWeek == DayOfWeek.Sunday)
        {
            startDate = startDate.AddDays(1);
            businessDays = businessDays - 1;
        }
    }
    else
    {
        if(startDate.DayOfWeek == DayOfWeek.Saturday)
        {
            startDate = startDate.AddDays(-1);
            businessDays = businessDays + 1;
        }
        else if(startDate.DayOfWeek == DayOfWeek.Sunday)
        {
            startDate = startDate.AddDays(-2);
            businessDays = businessDays + 1;
        }
    }

    int initialDayOfWeek = (int)startDate.DayOfWeek;

    int weeksBase = Math.Abs(businessDays / 5);
    int addDays = Math.Abs(businessDays % 5);

    if((direction == 1 && addDays + initialDayOfWeek > 5) ||
         (direction == -1 && addDays >= initialDayOfWeek))
    {
        addDays += 2;
    }

    int totalDays = (weeksBase * 7) + addDays;
    return startDate.AddDays(totalDays * direction);
}

14
তারিখের মতো অযৌক্তিক কোনও কিছুর কথা আসে তখন কি কি দুর্দান্ত সমাধান রয়েছে?
— ওয়াইয়াট বার্নেট

আপনি কি ছুটির সাথে সম্মত হন? - জেমস Conigliaro। না
— অ্যাড্রিয়ান জানেস্কু

9
সাহায্য করার চেষ্টা করা লোককে ভোট দেওয়া কোনও বিজয়ী কৌশল নয়।
— জেমি আইডে

4
AddBusinessDaysউপরের প্রশ্নে বাস্তবায়ন সম্পর্কে সংক্ষিপ্ত দ্রষ্টব্য (যা আসলে আমি মুছে ফেলার উত্তরটি মুছে ফেলার প্রস্তাব দিয়েছিলাম; পরিবর্তে প্রশ্নের উত্তরটির একটি অনুলিপি করেছেন): আমার মতে এই সমাধানটি এখন পর্যন্ত সমস্ত উত্তরের চেয়ে ভাল কারণ এটি একমাত্র যেটি নেতিবাচক মানগুলির সাথে সঠিকভাবে ডিল করে, উত্স হিসাবে শনি ও রবিবার এবং তৃতীয় পক্ষের lib প্রয়োজন হয় না। (আমি এখানে বিভিন্ন সমাধানগুলি পরীক্ষা করার জন্য একটি ছোট প্রোগ্রাম তৈরি করেছি)) আমি কেবল if (businessDays == 0) return startDate;এই প্রান্তের ক্ষেত্রে সঠিক ফলাফল পেতে পদ্ধতির শুরুতে যুক্ত করব ।
— স্লুমা

4
@ এজেড: প্রথম মোছাটি বেশ পুরানো ছিল। আপনার উত্তরটি মুছে ফেলার জন্য আমার অনুরোধের পরে একটি মোড আপনার প্রশ্নের নীচের সামগ্রীটি অনুলিপি করতে উত্তরটি (30 সেকেন্ডের জন্য) মুছে ফেলেছিল এবং তারপরে তিনি তা আবার মুছে ফেললেন। এজন্য আপনার উত্তরটিতে সাম্প্রতিক মুছে ফেলা সময়ের স্ট্যাম্প রয়েছে। আমি উপরের মন্তব্যটি লিখেছিলাম কারণ আমার প্রয়োজনে আপনার AddBusinessDaysএখানে সবচেয়ে সাধারণ সমাধান যা আমার প্রয়োজন সমস্ত ক্ষেত্রে কাজ করেছিল। আমি আমার বর্তমান প্রকল্পগুলির মধ্যে এটির একটি অনুলিপি করেছি (সি ++ তে সামান্য পরিবর্তন এবং অনুবাদ করার পরে), কোডের জন্য ধন্যবাদ :) এটি অনেকটা সহায়তা করেছে যেহেতু সমস্ত প্রান্তের মামলাগুলি সঠিকভাবে অর্জন করা আশ্চর্যজনকভাবে কঠিন।
— স্লুমা

উত্তর:


136

আপনার প্রথম ফাংশনের জন্য সর্বশেষ প্রচেষ্টা:

public static DateTime AddBusinessDays(DateTime date, int days)
{
    if (days < 0)
    {
        throw new ArgumentException("days cannot be negative", "days");
    }

    if (days == 0) return date;

    if (date.DayOfWeek == DayOfWeek.Saturday)
    {
        date = date.AddDays(2);
        days -= 1;
    }
    else if (date.DayOfWeek == DayOfWeek.Sunday)
    {
        date = date.AddDays(1);
        days -= 1;
    }

    date = date.AddDays(days / 5 * 7);
    int extraDays = days % 5;

    if ((int)date.DayOfWeek + extraDays > 5)
    {
        extraDays += 2;
    }

    return date.AddDays(extraDays);

}

দ্বিতীয় ফাংশন, গেটব্যাসনেসডাইস নিম্নলিখিত হিসাবে প্রয়োগ করা যেতে পারে:

public static int GetBusinessDays(DateTime start, DateTime end)
{
    if (start.DayOfWeek == DayOfWeek.Saturday)
    {
        start = start.AddDays(2);
    }
    else if (start.DayOfWeek == DayOfWeek.Sunday)
    {
        start = start.AddDays(1);
    }

    if (end.DayOfWeek == DayOfWeek.Saturday)
    {
        end = end.AddDays(-1);
    }
    else if (end.DayOfWeek == DayOfWeek.Sunday)
    {
        end = end.AddDays(-2);
    }

    int diff = (int)end.Subtract(start).TotalDays;

    int result = diff / 7 * 5 + diff % 7;

    if (end.DayOfWeek < start.DayOfWeek)
    {
        return result - 2;
    }
    else{
        return result;
    }
}

দ্বিতীয়টির জন্য, একটি সমাধান হ'ল তারিখ এবং তারিখ + দিনের মধ্যে পার্থক্য নেওয়া। এটি দুর্দান্ত যে এটি গ্যারান্টি দেয় যে দুটি ফাংশন সঠিকভাবে সিঙ্ক হবে এবং এটি অপ্রয়োজনীয়তা সরিয়ে দেয়।
— ব্রায়ান

বর্তমান তারিখের ফিড দিন, 0 থেকে 10 ব্যবসায়িক দিনের জন্য চলুন, এটি সর্বদা বুধবার ব্যর্থ হয়।
— অ্যাড্রিয়ান গডং

4
হ্যাঁ, আমরা শেষ পর্যন্ত সেখানে এসেছি। (আমি আমার ক্ষুদ্র অবদানের জন্য 'আমরা' বলি!) প্রচেষ্টার পক্ষে ভোট দিয়েছি।
— নলডোরিন

আপনার ইনপুট নলডোরিনের জন্য ধন্যবাদ, আমি দুর্ভাগ্যক্রমে কেবলমাত্র আপনার মন্তব্যে উজ্জীবিত করতে পারি!
— প্যাট্রিক ম্যাকডোনাল্ড

4
ডেটটাইম.এডডয়েস নেতিবাচক সংখ্যার সাথে কাজ করে। এটি অ্যাডব্যাসনেসডয়েসের সাহায্যে নেতিবাচক সংখ্যাগুলি ব্যবহার করার মতো একই প্যাটার্নটিকে সঠিকভাবে অনুসরণ করে না যা অ-ব্যবসায়িক দিনগুলি নির্বাচন করার অনুমতি দেয়।
— রিস্টোগড

63

ফ্লুয়েন্ট ডেটটাইম ব্যবহার করে :

var now = DateTime.Now;
var dateTime1 = now.AddBusinessDays(3);
var dateTime2 = now.SubtractBusinessDays(5);

অভ্যন্তরীণ কোড নিম্নরূপ:

    /// <summary>
    /// Adds the given number of business days to the <see cref="DateTime"/>.
    /// </summary>
    /// <param name="current">The date to be changed.</param>
    /// <param name="days">Number of business days to be added.</param>
    /// <returns>A <see cref="DateTime"/> increased by a given number of business days.</returns>
    public static DateTime AddBusinessDays(this DateTime current, int days)
    {
        var sign = Math.Sign(days);
        var unsignedDays = Math.Abs(days);
        for (var i = 0; i < unsignedDays; i++)
        {
            do
            {
                current = current.AddDays(sign);
            }
            while (current.DayOfWeek == DayOfWeek.Saturday ||
                current.DayOfWeek == DayOfWeek.Sunday);
        }
        return current;
    }

    /// <summary>
    /// Subtracts the given number of business days to the <see cref="DateTime"/>.
    /// </summary>
    /// <param name="current">The date to be changed.</param>
    /// <param name="days">Number of business days to be subtracted.</param>
    /// <returns>A <see cref="DateTime"/> increased by a given number of business days.</returns>
    public static DateTime SubtractBusinessDays(this DateTime current, int days)
    {
        return AddBusinessDays(current, -days);
    }

ভিবি.নেটে রূপান্তরিত হওয়ার সময় এটিই আমার একমাত্র সমাধান যা বাস্তবে কাজ করেছিল
— নিকোলাস

4
ওপিতে কোনও লুপের অনুরোধ করা হয়নি, যখন এটির স্পষ্টভাবে লুপ রয়েছে। স্বল্প দক্ষতার সাথে কিছু করার মতো মার্জিত কিছুই নেই।
— নিওলিস্ক

13

আমি একটি এক্সটেনশন তৈরি করেছি যা আপনাকে ব্যবসায়ের দিনগুলি যোগ করতে বা বিয়োগ করতে দেয়। বিয়োগের জন্য ব্যবসায়িক সংখ্যার নেতিবাচক সংখ্যা ব্যবহার করুন। আমি মনে করি এটি বেশ মার্জিত সমাধান। এটা সব ক্ষেত্রে কাজ করে বলে মনে হচ্ছে।

namespace Extensions.DateTime
{
    public static class BusinessDays
    {
        public static System.DateTime AddBusinessDays(this System.DateTime source, int businessDays)
        {
            var dayOfWeek = businessDays < 0
                                ? ((int)source.DayOfWeek - 12) % 7
                                : ((int)source.DayOfWeek + 6) % 7;

            switch (dayOfWeek)
            {
                case 6:
                    businessDays--;
                    break;
                case -6:
                    businessDays++;
                    break;
            }

            return source.AddDays(businessDays + ((businessDays + dayOfWeek) / 5) * 2);
        }
    }
}

উদাহরণ:

using System;
using System.Windows.Forms;
using Extensions.DateTime;

namespace AddBusinessDaysTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            label1.Text = DateTime.Now.AddBusinessDays(5).ToString();
            label2.Text = DateTime.Now.AddBusinessDays(-36).ToString();
        }
    }
}

উত্স তারিখটি শনিবার বা রবিবার হলে ফলাফলটি প্রশ্নবিদ্ধ। উদাহরণস্বরূপ: শনিবার +1 ব্যবসায়িক দিনের ফলাফল মঙ্গলবার, যেখানে আমি বরং সোমবার আশা করব।
— স্লুমা

4
@ স্লোমা: কানাডার বেশিরভাগ ব্যবসা এভাবেই চালিত হয়। +1 ব্যবসায়িক দিন = "পরবর্তী ব্যবসায়ের দিন", যা শনিবারের ক্ষেত্রে মঙ্গলবার is সোমবার হবে "একই ব্যবসায়িক দিন"।
— নিওলিস্ক

4
@ স্লুমা প্রোগ্রাম ইচ্ছানুসারে কাজ করে। যৌক্তিকভাবে এটি সম্পর্কে চিন্তা করুন। যদি শনিবার ব্যবসায়ের সাথে সম্পর্কিত কোনও জিনিস শুরু হয়, এবং আপনাকে এই ব্যবসায়িক দিবসের সময়কালে লোকজনের জন্য প্রতিক্রিয়া দেখাতে 1 ব্যবসায়িক দিন দেওয়ার অনুমতি দিতে হবে, তবে সোমবারের মধ্যেই এটি করা উচিত তা কি তাদের বোঝা উচিত ?!
— রিগার্ড স্টেইন

8

আমার জন্য আমার একটি সমাধান করতে হয়েছিল যা সাপ্তাহিক ছুটি এড়ায় এবং নেতিবাচক বা ধনাত্মক হয়। আমার মানদণ্ডটি ছিল যদি এটি এগিয়ে যায় এবং সপ্তাহান্তে অবতরণ করা হয় তবে সোমবার যেতে হবে। যদি এটি পিছনে চলে যায় এবং সপ্তাহান্তে অবতরণ হয় তবে এটি শুক্রবারে লাফিয়ে যেতে হবে।

উদাহরণ স্বরূপ:

  • বুধবার - 3 ব্যবসায়িক দিন = গত শুক্রবার
  • বুধবার + 3 ব্যবসায়িক দিন = সোমবার
  • শুক্রবার - 7 টি ব্যবসায়িক দিন = গত বুধবার
  • মঙ্গলবার - 5 ব্যবসায়িক দিন = গত মঙ্গলবার

হ্যাঁ, আপনি ধারণা পেতে পারেন ;)

আমি এই এক্সটেনশন ক্লাসটি লিখে শেষ করেছি

public static partial class MyExtensions
{
    public static DateTime AddBusinessDays(this DateTime date, int addDays)
    {
        while (addDays != 0)
        {
            date = date.AddDays(Math.Sign(addDays));
            if (MyClass.IsBusinessDay(date))
            {
                addDays = addDays - Math.Sign(addDays);
            }
        }
        return date;
    }
}

এটি এই পদ্ধতিটি ব্যবহার করে আমি ভেবেছিলাম অন্য কোথাও ব্যবহারে দরকারী হবে ...

public class MyClass
{
    public static bool IsBusinessDay(DateTime date)
    {
        switch (date.DayOfWeek)
        {
            case DayOfWeek.Monday:
            case DayOfWeek.Tuesday:
            case DayOfWeek.Wednesday:
            case DayOfWeek.Thursday:
            case DayOfWeek.Friday:
                return true;
            default:
                return false;
        }
    }
}

আপনি যদি এটির সাথে বিরক্ত করতে না চান তবে আপনি কেবল if (MyClass.IsBusinessDay(date))যদি এর সাথে প্রতিস্থাপন করতে পারেনif ((date.DayOfWeek != DayOfWeek.Saturday) && (date.DayOfWeek != DayOfWeek.Sunday))

সুতরাং এখন আপনি করতে পারেন

var myDate = DateTime.Now.AddBusinessDays(-3);

বা

var myDate = DateTime.Now.AddBusinessDays(5);

কিছু পরীক্ষার ফলাফল এখানে:

পরীক্ষার প্রত্যাশিত ফলাফল
বুধবার -4 ব্যবসায়িক দিন বৃহস্পতিবার
বুধবার -৩ ব্যবসায়িক দিন শুক্রবার
বুধবার +3 ব্যবসায়িক দিন সোমবার সোমবার
শুক্রবার -7 ব্যবসায়িক দিন বুধবার
মঙ্গলবার -5 ব্যবসায়িক দিন মঙ্গলবার
শুক্রবার +1 ব্যবসায়িক দিন সোমবার সোমবার
শনিবার +1 ব্যবসায়িক দিন সোমবার সোমবার
রবিবার -১ ব্যবসায়িক দিন শুক্রবার
সোমবার -১ ব্যবসায়িক দিন শুক্রবার
সোমবার +1 ব্যবসায়িক দিন মঙ্গলবার
সোমবার +0 ব্যবসায়িক দিন সোমবার সোমবার

আমি ২ য় পদ্ধতিটিকেও বর্ধিতকরণের পদ্ধতি হিসাবে তৈরি করেছি: পাবলিক স্ট্যাটিক বুল ইসব্যাসনেসডে (এই তারিখের সময় তারিখ)
— অ্যান্ডি বি

2
public static DateTime AddBusinessDays(this DateTime date, int days)
{
    date = date.AddDays((days / 5) * 7);

    int remainder = days % 5;

    switch (date.DayOfWeek)
    {
        case DayOfWeek.Tuesday:
            if (remainder > 3) date = date.AddDays(2);
            break;
        case DayOfWeek.Wednesday:
            if (remainder > 2) date = date.AddDays(2);
            break;
        case DayOfWeek.Thursday:
            if (remainder > 1) date = date.AddDays(2);
            break;
        case DayOfWeek.Friday:
            if (remainder > 0) date = date.AddDays(2);
            break;
        case DayOfWeek.Saturday:
            if (days > 0) date = date.AddDays((remainder == 0) ? 2 : 1);
            break;
        case DayOfWeek.Sunday:
            if (days > 0) date = date.AddDays((remainder == 0) ? 1 : 0);
            break;
        default:  // monday
            break;
    }

    return date.AddDays(remainder);
}

1

উত্তরের জন্য আমি দেরি করে আসছি, তবে কাজের দিনগুলিতে সাধারণ ক্রিয়াকলাপ করার জন্য প্রয়োজনীয় সমস্ত কাস্টমাইজেশন সহ আমি একটি ছোট গ্রন্থাগার তৈরি করেছি ... আমি এটি এখানে রেখেছি: ওয়ার্কিং ডে ম্যানেজমেন্ট


4
দুর্ভাগ্যক্রমে এটি জিএনইউ লাইসেন্সড তাই কোনও বাণিজ্যিক অ্যাপের জন্য "আইনী বিষ"। আপনি কি "এমআইটি" বা "অ্যাপাচি" এ আরাম চান?
— টনি ও'হাগান

কিছু স্থির তালিকা সম্ভবত অ্যারে (লিঙ্কযুক্ত তালিকার চেয়ে) হওয়া উচিত।
— টনি ও'হাগান

4
আমি সবেমাত্র এমআইটি-তে লাইসেন্স পরিবর্তন করেছি (আমি কোনও সাধারণ কিছুতে ব্লক করতে চাই না)। আমি আপনার অন্যান্য প্রস্তাব বিবেচনা করব।
— অবিরাম

ভাল লাগবে, দেশ অনুযায়ী ওয়ার্কিং ডে ম্যানেজমেন্ট দেখতে আকর্ষণীয় হবে কারণ কয়েকটি দেশের সোমবার থেকে শুক্রবারের তুলনায় অন্যান্য কার্যদিবস থাকতে পারে।
— সিরিয়ালাইজার

1

একমাত্র আসল সমাধান হ'ল এই কলগুলি এমন একটি ডেটাবেস টেবিল অ্যাক্সেস করা যা আপনার ব্যবসায়ের জন্য ক্যালেন্ডার সংজ্ঞায়িত করে। আপনি সোমবার থেকে শুক্রবার ওয়ার্কউইককে খুব বেশি কঠিন ছাড়াই কোড করতে পারেন তবে ছুটির দিনগুলি পরিচালনা করা চ্যালেঞ্জ হতে পারে।

অ-মার্জিত এবং অ পরীক্ষিত আংশিক সমাধান যুক্ত করতে সম্পাদিত:

public static DateTime AddBusinessDays(this DateTime date, int days)
{
    for (int index = 0; index < days; index++)
    {
        switch (date.DayOfWeek)
        {
            case DayOfWeek.Friday:
                date = date.AddDays(3);
                break;
            case DayOfWeek.Saturday:
                date = date.AddDays(2);
                break;
            default:
                date = date.AddDays(1);
                break;
         }
    }
    return date;
}

এছাড়াও আমি লুপগুলির প্রয়োজনীয়তা লঙ্ঘন করেছি।


আমি মনে করি না শনিবারের মামলাটি কখনও আঘাত হানে।
— কোডারডেনিস

@ ডেনিস - এটি যদি পাসের তারিখটি শনিবার হয়।
— জ্যামি আইডে

আমি আপনার কোডটি সম্পাদন করার জন্য স্বাধীনতা নিয়েছি যাতে এটি কার্যকর হয়। পরের বার পোস্ট করার আগে দয়া করে কোডটি পরীক্ষা করুন, আপনাকে ধন্যবাদ।
— bytecode77

এবং আমি ভেবেছিলাম শূন্য upvotes নিজের জন্য কথা বলতে। ধন্যবাদ!
— জেমি আইডে

1

আমি এই পোস্টটি পুনরুত্থিত করছি কারণ আজ আমাকে কেবল শনিবার এবং রবিবার সপ্তাহের দিনগুলিই নয়, ছুটির দিনগুলিও বাদ দেওয়ার উপায় খুঁজে পেতে হয়েছিল । আরও নির্দিষ্টভাবে, আমার সম্ভাব্য ছুটির বিভিন্ন সেট হ্যান্ডেল করা দরকার:

  • দেশ-আক্রমণকারী ছুটি (অন্তত পশ্চিমা দেশগুলির জন্য - যেমন জানুয়ারী, ২০১১)
  • গণনা করা ছুটি (যেমন ইস্টার এবং ইস্টার সোমবার)।
  • দেশ-নির্দিষ্ট ছুটি (যেমন ইতালিয়ান মুক্তির দিন বা মার্কিন যুক্তরাষ্ট্রের আইডি 4)
  • শহর-নির্দিষ্ট ছুটি (যেমন রোম সেন্ট প্যাট্রন দিবস)।
  • অন্য কোনও কাস্টম তৈরি ছুটির দিন (যেমন "আগামীকাল আমাদের অফিস বন্ধ হয়ে যাবে")।

অবশেষে, আমি নিম্নলিখিত সহায়ক / এক্সটেনশন শ্রেণীর সেট নিয়ে বেরিয়ে এসেছি: যদিও তারা অস্পষ্টভাবে মার্জিত নয়, তারা অপ্রয়োজনীয় লুপগুলির ব্যাপক ব্যবহার করে, তবে তারা আমার সমস্যাগুলি ভাল করার জন্য যথেষ্ট পরিমাণে শালীন। আমি এই পোস্টে এখানে পুরো উত্স কোডটি ফেলে দিচ্ছি, আশা করি এটি অন্য কারও পক্ষেও কার্যকর হবে।

সোর্স কোড

/// <summary>
/// Helper/extension class for manipulating date and time values.
/// </summary>
public static class DateTimeExtensions
{
    /// <summary>
    /// Calculates the absolute year difference between two dates.
    /// </summary>
    /// <param name="dt1"></param>
    /// <param name="dt2"></param>
    /// <returns>A whole number representing the number of full years between the specified dates.</returns>
    public static int Years(DateTime dt1,DateTime dt2)
    {
        return Months(dt1,dt2)/12;
        //if (dt2<dt1)
        //{
        //    DateTime dt0=dt1;
        //    dt1=dt2;
        //    dt2=dt0;
        //}

        //int diff=dt2.Year-dt1.Year;
        //int m1=dt1.Month;
        //int m2=dt2.Month;
        //if (m2>m1) return diff;
        //if (m2==m1 && dt2.Day>=dt1.Day) return diff;
        //return (diff-1);
    }

    /// <summary>
    /// Calculates the absolute year difference between two dates.
    /// Alternative, stand-alone version (without other DateTimeUtil dependency nesting required)
    /// </summary>
    /// <param name="start"></param>
    /// <param name="end"></param>
    /// <returns></returns>
    public static int Years2(DateTime start, DateTime end)
    {
        return (end.Year - start.Year - 1) +
            (((end.Month > start.Month) ||
            ((end.Month == start.Month) && (end.Day >= start.Day))) ? 1 : 0);
    }

    /// <summary>
    /// Calculates the absolute month difference between two dates.
    /// </summary>
    /// <param name="dt1"></param>
    /// <param name="dt2"></param>
    /// <returns>A whole number representing the number of full months between the specified dates.</returns>
    public static int Months(DateTime dt1,DateTime dt2)
    {
        if (dt2<dt1)
        {
            DateTime dt0=dt1;
            dt1=dt2;
            dt2=dt0;
        }

        dt2=dt2.AddDays(-(dt1.Day-1));
        return (dt2.Year-dt1.Year)*12+(dt2.Month-dt1.Month);
    }

    /// <summary>
    /// Returns the higher of the two date time values.
    /// </summary>
    /// <param name="dt1">The first of the two <c>DateTime</c> values to compare.</param>
    /// <param name="dt2">The second of the two <c>DateTime</c> values to compare.</param>
    /// <returns><c>dt1</c> or <c>dt2</c>, whichever is higher.</returns>
    public static DateTime Max(DateTime dt1,DateTime dt2)
    {
        return (dt2>dt1?dt2:dt1);
    }

    /// <summary>
    /// Returns the lower of the two date time values.
    /// </summary>
    /// <param name="dt1">The first of the two <c>DateTime</c> values to compare.</param>
    /// <param name="dt2">The second of the two <c>DateTime</c> values to compare.</param>
    /// <returns><c>dt1</c> or <c>dt2</c>, whichever is lower.</returns>
    public static DateTime Min(DateTime dt1,DateTime dt2)
    {
        return (dt2<dt1?dt2:dt1);
    }

    /// <summary>
    /// Adds the given number of business days to the <see cref="DateTime"/>.
    /// </summary>
    /// <param name="current">The date to be changed.</param>
    /// <param name="days">Number of business days to be added.</param>
    /// <param name="holidays">An optional list of holiday (non-business) days to consider.</param>
    /// <returns>A <see cref="DateTime"/> increased by a given number of business days.</returns>
    public static DateTime AddBusinessDays(
        this DateTime current, 
        int days, 
        IEnumerable<DateTime> holidays = null)
    {
        var sign = Math.Sign(days);
        var unsignedDays = Math.Abs(days);
        for (var i = 0; i < unsignedDays; i++)
        {
            do
            {
                current = current.AddDays(sign);
            }
            while (current.DayOfWeek == DayOfWeek.Saturday
                || current.DayOfWeek == DayOfWeek.Sunday
                || (holidays != null && holidays.Contains(current.Date))
                );
        }
        return current;
    }

    /// <summary>
    /// Subtracts the given number of business days to the <see cref="DateTime"/>.
    /// </summary>
    /// <param name="current">The date to be changed.</param>
    /// <param name="days">Number of business days to be subtracted.</param>
    /// <param name="holidays">An optional list of holiday (non-business) days to consider.</param>
    /// <returns>A <see cref="DateTime"/> increased by a given number of business days.</returns>
    public static DateTime SubtractBusinessDays(
        this DateTime current, 
        int days,
        IEnumerable<DateTime> holidays)
    {
        return AddBusinessDays(current, -days, holidays);
    }

    /// <summary>
    /// Retrieves the number of business days from two dates
    /// </summary>
    /// <param name="startDate">The inclusive start date</param>
    /// <param name="endDate">The inclusive end date</param>
    /// <param name="holidays">An optional list of holiday (non-business) days to consider.</param>
    /// <returns></returns>
    public static int GetBusinessDays(
        this DateTime startDate, 
        DateTime endDate,
        IEnumerable<DateTime> holidays)
    {
        if (startDate > endDate)
            throw new NotSupportedException("ERROR: [startDate] cannot be greater than [endDate].");

        int cnt = 0;
        for (var current = startDate; current < endDate; current = current.AddDays(1))
        {
            if (current.DayOfWeek == DayOfWeek.Saturday
                || current.DayOfWeek == DayOfWeek.Sunday
                || (holidays != null && holidays.Contains(current.Date))
                )
            {
                // skip holiday
            }
            else cnt++;
        }
        return cnt;
    }

    /// <summary>
    /// Calculate Easter Sunday for any given year.
    /// src.: https://stackoverflow.com/a/2510411/1233379
    /// </summary>
    /// <param name="year">The year to calcolate Easter against.</param>
    /// <returns>a DateTime object containing the Easter month and day for the given year</returns>
    public static DateTime GetEasterSunday(int year)
    {
        int day = 0;
        int month = 0;

        int g = year % 19;
        int c = year / 100;
        int h = (c - (int)(c / 4) - (int)((8 * c + 13) / 25) + 19 * g + 15) % 30;
        int i = h - (int)(h / 28) * (1 - (int)(h / 28) * (int)(29 / (h + 1)) * (int)((21 - g) / 11));

        day = i - ((year + (int)(year / 4) + i + 2 - c + (int)(c / 4)) % 7) + 28;
        month = 3;

        if (day > 31)
        {
            month++;
            day -= 31;
        }

        return new DateTime(year, month, day);
    }

    /// <summary>
    /// Retrieve holidays for given years
    /// </summary>
    /// <param name="years">an array of years to retrieve the holidays</param>
    /// <param name="countryCode">a country two letter ISO (ex.: "IT") to add the holidays specific for that country</param>
    /// <param name="cityName">a city name to add the holidays specific for that city</param>
    /// <returns></returns>
    public static IEnumerable<DateTime> GetHolidays(IEnumerable<int> years, string countryCode = null, string cityName = null)
    {
        var lst = new List<DateTime>();

        foreach (var year in years.Distinct())
        {
            lst.AddRange(new[] {
                new DateTime(year, 1, 1),       // 1 gennaio (capodanno)
                new DateTime(year, 1, 6),       // 6 gennaio (epifania)
                new DateTime(year, 5, 1),       // 1 maggio (lavoro)
                new DateTime(year, 8, 15),      // 15 agosto (ferragosto)
                new DateTime(year, 11, 1),      // 1 novembre (ognissanti)
                new DateTime(year, 12, 8),      // 8 dicembre (immacolata concezione)
                new DateTime(year, 12, 25),     // 25 dicembre (natale)
                new DateTime(year, 12, 26)      // 26 dicembre (s. stefano)
            });

            // add easter sunday (pasqua) and monday (pasquetta)
            var easterDate = GetEasterSunday(year);
            lst.Add(easterDate);
            lst.Add(easterDate.AddDays(1));

            // country-specific holidays
            if (!String.IsNullOrEmpty(countryCode))
            {
                switch (countryCode.ToUpper())
                {
                    case "IT":
                        lst.Add(new DateTime(year, 4, 25));     // 25 aprile (liberazione)
                        break;
                    case "US":
                        lst.Add(new DateTime(year, 7, 4));     // 4 luglio (Independence Day)
                        break;

                    // todo: add other countries

                    case default:
                        // unsupported country: do nothing
                        break;
                }
            }

            // city-specific holidays
            if (!String.IsNullOrEmpty(cityName))
            {
                switch (cityName)
                {
                    case "Rome":
                    case "Roma":
                        lst.Add(new DateTime(year, 6, 29));  // 29 giugno (s. pietro e paolo)
                        break;
                    case "Milano":
                    case "Milan":
                        lst.Add(new DateTime(year, 12, 7));  // 7 dicembre (s. ambrogio)
                        break;

                    // todo: add other cities

                    default:
                        // unsupported city: do nothing
                        break;

                }
            }
        }
        return lst;
    }
}

ব্যবহারের তথ্য

কোডটি বেশ স্ব-বর্ণনামূলক, তবে আপনি কীভাবে এটি ব্যবহার করতে পারেন তা বোঝাতে এখানে কয়েকটি উদাহরণ দেওয়া হয়েছে।

10 টি ব্যবসায়িক দিন যুক্ত করুন (কেবল শনিবার এবং রবিবারের সপ্তাহের দিনগুলি এড়িয়ে যাওয়া)

var dtResult = DateTimeUtil.AddBusinessDays(srcDate, 10);

10 ব্যবসায়িক দিন যুক্ত করুন (শনিবার, রবিবার এবং 2019 এর জন্য সমস্ত দেশ-আক্রমণকারী ছুটির দিন বাদ দেওয়া)

var dtResult = DateTimeUtil.AddBusinessDays(srcDate, 10, GetHolidays(2019));

10 টি ব্যবসায়িক দিন যুক্ত করুন (শনিবার, রবিবার এবং 2019 এর সমস্ত ইতালীয় ছুটির দিন বাদ দেওয়া)

var dtResult = DateTimeUtil.AddBusinessDays(srcDate, 10, GetHolidays(2019, "IT"));

10 টি ব্যবসায়িক দিন যুক্ত করুন (শনিবার, রবিবার, সমস্ত ইতালীয় ছুটি এবং 2019 সালের রোম-নির্দিষ্ট ছুটিগুলি এড়িয়ে যাওয়া) যুক্ত করুন

var dtResult = DateTimeUtil.AddBusinessDays(srcDate, 10, GetHolidays(2019, "IT", "Rome"));

উপরের ফাংশন এবং কোডের উদাহরণগুলি আমার ব্লগের এই পোস্টে আরও ব্যাখ্যা করা হয়েছে ।


0
    public static DateTime AddBusinessDays(DateTime date, int days)
    {
        if (days == 0) return date;
        int i = 0;
        while (i < days)
        {
            if (!(date.DayOfWeek == DayOfWeek.Saturday ||  date.DayOfWeek == DayOfWeek.Sunday)) i++;  
            date = date.AddDays(1);
        }
        return date;
    }

ভবিষ্যতে উত্তরের জন্য কিছুটা আরও প্রসঙ্গ যুক্ত করুন এবং আপনি যা রেখেছেন তা কেন রেখেছেন :)
— dax

0

আমি একটি "অ্যাডবসনেসডাইস" চেয়েছিলাম যা যোগ করার জন্য নেতিবাচক সংখ্যক দিনকে সমর্থন করেছিল এবং আমি এটি দিয়ে শেষ করেছি:

// 0 == Monday, 6 == Sunday
private static int epochDayToDayOfWeek0Based(long epochDay) {
    return (int)Math.floorMod(epochDay + 3, 7);
}

public static int daysBetween(long fromEpochDay, long toEpochDay) {
    // http://stackoverflow.com/questions/1617049/calculate-the-number-of-business-days-between-two-dates
    final int fromDOW = epochDayToDayOfWeek0Based(fromEpochDay);
    final int toDOW = epochDayToDayOfWeek0Based(toEpochDay);
    long calcBusinessDays = ((toEpochDay - fromEpochDay) * 5 + (toDOW - fromDOW) * 2) / 7;

    if (toDOW   == 6) calcBusinessDays -= 1;
    if (fromDOW == 6) calcBusinessDays += 1;
    return (int)calcBusinessDays;
}

public static long addDays(long epochDay, int n) {
    // https://alecpojidaev.wordpress.com/2009/10/29/work-days-calculation-with-c/
    // NB: in .NET, Sunday == 0, but in our code Monday == 0
    final int dow = (epochDayToDayOfWeek0Based(epochDay) + 1) % 7;
    final int wds = n + (dow == 0 ? 1 : dow); // Adjusted number of working days to add, given that we now start from the immediately preceding Sunday
    final int wends = n < 0 ? ((wds - 5) / 5) * 2
                            : (wds / 5) * 2 - (wds % 5 == 0 ? 2 : 0);
    return epochDay - dow + // Find the immediately preceding Sunday
           wds +            // Add computed working days
           wends;           // Add weekends that occur within each complete working week
}

কোনও লুপের প্রয়োজন নেই, সুতরাং এটি "বড়" সংযোজনের জন্যও যুক্তিসঙ্গত দ্রুত হওয়া উচিত।

এটি যুগের পর থেকে বেশ কয়েকটি ক্যালেন্ডার দিন হিসাবে প্রকাশিত দিনগুলির সাথে কাজ করে, যেহেতু এটি নতুন জেডিকে 8 স্থানীয় তারিখ শ্রেণীর দ্বারা প্রকাশিত হয়েছিল এবং আমি জাভাতে কাজ করছিলাম। যদিও অন্যান্য সেটিংসের সাথে খাপ খাইয়ে নিতে সহজ হওয়া উচিত।

মৌলিক বৈশিষ্ট্য addDaysহ'ল সর্বদা একটি সপ্তাহের দিন ফিরে আসে এবং এটি সকলের জন্য dএবং n,daysBetween(d, addDays(d, n)) == n

নোট করুন যে তাত্ত্বিকভাবে 0 দিন যোগ করা এবং 0 দিন বিয়োগ করা পৃথক ক্রিয়াকলাপ হওয়া উচিত (যদি আপনার তারিখ রবিবার হয় তবে 0 দিনের যোগে আপনাকে সোমবারে নিয়ে যাওয়া উচিত, এবং 0 দিনের বিয়োগ করা আপনাকে শুক্রবারে নিয়ে যেতে পারে)। যেহেতু নেতিবাচক 0 এর মতো কোনও জিনিস নেই (ভাসমান পয়েন্টের বাইরে!), তাই আমি একটি যুক্তি n = 0 এর অর্থ শূন্য দিন যুক্ত হিসাবে ব্যাখ্যা করতে বেছে নিয়েছি ।


0

আমি বিশ্বাস করি এটি getBusinessDays এর একটি সহজ উপায় হতে পারে:

    public int GetBusinessDays(DateTime start, DateTime end, params DateTime[] bankHolidays)
    {
        int tld = (int)((end - start).TotalDays) + 1; //including end day
        int not_buss_day = 2 * (tld / 7); //Saturday and Sunday
        int rest = tld % 7; //rest.

        if (rest > 0)
        {
            int tmp = (int)start.DayOfWeek - 1 + rest;
            if (tmp == 6 || start.DayOfWeek == DayOfWeek.Sunday) not_buss_day++; else if (tmp > 6) not_buss_day += 2;
        }

        foreach (DateTime bankHoliday in bankHolidays)
        {
            DateTime bh = bankHoliday.Date;
            if (!(bh.DayOfWeek == DayOfWeek.Saturday || bh.DayOfWeek == DayOfWeek.Sunday) && (start <= bh && bh <= end))
            {
                not_buss_day++;
            }
        }
        return tld - not_buss_day;
    }

0

এখানে প্রস্থান তারিখ এবং গ্রাহকের প্রসবের তারিখ উভয় সহ আমার কোড is

            // Calculate departure date
            TimeSpan DeliveryTime = new TimeSpan(14, 30, 0); 
            TimeSpan now = DateTime.Now.TimeOfDay;
            DateTime dt = DateTime.Now;
            if (dt.TimeOfDay > DeliveryTime) dt = dt.AddDays(1);
            if (dt.DayOfWeek == DayOfWeek.Saturday) dt = dt.AddDays(1);
            if (dt.DayOfWeek == DayOfWeek.Sunday) dt = dt.AddDays(1);
            dt = dt.Date + DeliveryTime;
            string DepartureDay = "today at "+dt.ToString("HH:mm");
            if (dt.Day!=DateTime.Now.Day)
            {
                DepartureDay = dt.ToString("dddd at HH:mm", new CultureInfo(WebContextState.CurrentUICulture));
            }
            Return DepartureDay;

            // Caclulate delivery date
            dt = dt.AddDays(1);
            if (dt.DayOfWeek == DayOfWeek.Saturday) dt = dt.AddDays(1);
            if (dt.DayOfWeek == DayOfWeek.Sunday) dt = dt.AddDays(1);
            string DeliveryDay = dt.ToString("dddd", new CultureInfo(WebContextState.CurrentUICulture));
            return DeliveryDay;

শুভ কোডিং।


0
public static DateTime AddWorkingDays(this DateTime date, int daysToAdd)
{
    while (daysToAdd > 0)
    {
        date = date.AddDays(1);

        if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
        {
            daysToAdd -= 1;
        }
    }

    return date;
}

0
public static int GetBusinessDays(this DateTime start, DateTime end)
            {
                return Enumerable.Range(0, (end- start).Days)
                                .Select(a => start.AddDays(a))
                                .Where(a => a.DayOfWeek != DayOfWeek.Sunday)
                                .Where(a => a.DayOfWeek != DayOfWeek.Saturday)
                                .Count();
    
            }

-1

আশা করি এটি কাউকে সাহায্য করবে।

private DateTime AddWorkingDays(DateTime addToDate, int numberofDays)
    {
        addToDate= addToDate.AddDays(numberofDays);
        while (addToDate.DayOfWeek == DayOfWeek.Saturday || addToDate.DayOfWeek == DayOfWeek.Sunday)
        {
            addToDate= addToDate.AddDays(1);
        }
        return addToDate;
    }

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