2008-11-10 13 views
19

एक तिथि को देखते हुए मैं इसमें कितने दिन जोड़ सकता हूं, लेकिन सप्ताहांत को छोड़कर। उदाहरण के लिए, 11/12/2008 (बुधवार) दिया गया और पांच जोड़ना 11/17/2008 (बुधवार) के बजाय 11/17/2008 (सोमवार) के परिणामस्वरूप होगा।किसी तारीख को दिन जोड़ना, लेकिन सप्ताहांत को छोड़कर

मैं एक साधारण समाधान के बारे में सोच सकता हूं जैसे प्रत्येक दिन लूपिंग जोड़ने और यह देखने के लिए कि यह सप्ताहांत है या नहीं, लेकिन मैं देखना चाहता हूं कि कुछ और सुरुचिपूर्ण है या नहीं। मुझे किसी भी एफ # समाधान में दिलचस्पी होगी।

+0

आप दिन या दिन के लाखों लोगों की एक छोटी संख्या जोड़ने के लिए जा रहे हैं? – LeppyR64

+7

बस आपको बताने के लिए - जैसे ही आप उन्हें बताते हैं कि सप्ताहांत को छोड़कर कोई समस्या नहीं है, वे भी छुट्टियां चाहते हैं। इससे पहले कि आप कुछ भी लागू करने से पहले सोचें। – dnord

उत्तर

14

Fluent दिनांक समय का उपयोग कर https://github.com/FluentDateTime/FluentDateTime

 var dateTime = DateTime.Now.AddBusinessDays(4); 
+2

एक बेहतर ओ (1) समाधान यहां पाया जा सकता है: http://stackoverflow.com/questions/1044688 –

-2

सप्ताह डब्ल्यू में साल विकास तथा मूल दिन और कार्य दिवसों की संख्या में मूल दिन की संख्या एन, जोड़ने के लिए अगले काम करने के दिन संख्या

W + N % 5. 

वर्ष में अगले दिन है को देखते हुए (बिना लपेटने की जांच के साथ)

D + ((N/5) * 7) + N % 5). 

यह माना जा रहा है कि आपके पास पूर्णांक विभाजन है।

+0

डाउन-वोट क्यों? क्या यह गलत परिणाम देता है? – DOK

+0

मुझे अपने उत्तर के साथ कोई स्पष्ट दोष नहीं दिख रहा है। एक टिप्पणी छोड़कर कह रही है कि क्या गलत है सहायक होगा। – gnud

+0

मैंने डाउनवोट नहीं किया लेकिन कई लोगों ने इस एल्गोरिदम का सुझाव दिया है और यह मेरे लिए गलत लगता है। क्या होता है जब आप शुक्रवार को 1 व्यावसायिक दिन जोड़ते हैं? 'n/5 * 7' शून्य है और' n% 5' एक है इसलिए आप एक जोड़ते हैं और शनिवार प्राप्त करते हैं लेकिन सही उत्तर सोमवार है। –

6
public DateTime AddBusinessDays(DateTime dt, int nDays) 
{ 
    int weeks = nDays/5; 
    nDays %= 5; 
    while(dt.DayOfWeek == DayOfWeek.Saturday || dt.DayOfWeek == DayOfWeek.Sunday) 
     dt = dt.AddDays(1); 

    while (nDays-- > 0) 
    { 
     dt = dt.AddDays(1); 
     if (dt.DayOfWeek == DayOfWeek.Saturday) 
      dt = dt.AddDays(2); 
    } 
    return dt.AddDays(weeks*7); 
} 
+0

यह आपके परिदृश्य के लिए जानबूझकर हो सकता है लेकिन शुक्रवार शनिवार या रविवार को इनपुट की गई किसी भी तारीख के लिए ठीक से गणना नहीं की जाती है। मार्को एम टिप्पणी इस के लिए काम करेगा। – Frazer

3
int daysToAdd = weekDaysToAdd + ((weekDaysToAdd/5) * 2) + (((origDate.DOW + (weekDaysToAdd % 5)) >= 5) ? 2 : 0); 
बुद्धि के लिए

; जोड़ने के लिए "वास्तविक" दिनों की संख्या सप्ताह के दिनों की संख्या है, जो कि आप निर्दिष्ट कर रहे हैं, साथ ही पूरे सप्ताह में पूर्ण सप्ताहों की संख्या (इसलिए सप्ताह के दिनों में जोड़ें/5) दो बार (सप्ताहांत में दो दिन); साथ ही सप्ताह के मूल दिन और हफ्ते के भीतर "सप्ताह के भीतर" जोड़ने के लिए सप्ताह के दिनों की संख्या (इसलिए सप्ताह के दिनों में मोड 5 जोड़ें) 5 से अधिक या बराबर है (यानी सप्ताहांत का दिन)।

नोट: यह मानता है कि 0 = सोमवार, 2 = मंगलवार, ... 6 = रविवार। इसके अलावा, यह नकारात्मक सप्ताहांत अंतराल पर काम नहीं करता है।

-1

फॉर्मूला होगा: कार्यदिवस (तिथि, दिन की संख्या, (काम करने के दिन (1)))

इस प्रयास करें। ये सहायता करेगा।

0

मैंने एक ऐसा एक्सटेंशन बनाया है जो आपको व्यावसायिक दिनों को जोड़ने या घटाने की अनुमति देता है। घटाए जाने के लिए व्यवसाय की नकारात्मक संख्या का उपयोग करें। ऐसा लगता है कि सभी मामलों में काम करता है।

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(); 
     } 
    } 
} 
+0

यह समाधान सटीक रूप से मानता है कि यदि आपकी स्रोत तिथि सप्ताहांत पर है, तो 1 जोड़ना या घटाना एक सप्ताह के दिन को पारित करने की अनुमति देगा, परिणामस्वरूप मंगलवार या गुरुवार को क्रमशः। प्लस शून्य सोमवार को वापस आ जाएगा। बहुत ही कुशल, बिना किसी पुनरावृत्ति/लूपिंग के। धन्यवाद! – Heliac

0

यह बेहतर है अगर किसी को भी एक TSQL समाधान के लिए लग रही है। कोड की एक पंक्ति और नकारात्मक के साथ काम करता है। क्योंकि यह एक स्थिर में रख लिए एक विस्तार विधि है

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; 
} 
3
बिना ओवर-उलझी एल्गोरिथ्म, तो आप सिर्फ इस तरह एक विस्तार विधि बना सकते हैं

कक्षा।

उपयोग:

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

कोड:

namespace ExtensionMethods 
{ 
    public static class MyExtensionMethods 
    { 
     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; 
     } 
    } 
} 
+0

यदि आप ऋणात्मक संख्या जोड़ते हैं तो अनंत लूप का कारण बन जाएगा। – Jules

+0

सच है। इस – tocqueville

2

मैं इस एक्सटेंशन का उपयोग होता है, याद रखें:

CREATE FUNCTION[dbo].[AddBusinessDays](@Date date,@n INT)RETURNS DATE AS BEGIN 
DECLARE @d INT;SET @d=4-SIGN(@n)*(4-DATEPART(DW,@Date)); 
RETURN DATEADD(D,@n+((ABS(@n)[email protected])/5)*2*SIGN(@n)[email protected]/7,@Date)END 
+0

के बेहतर संस्करण के लिए ओग्ग्लस का उत्तर देखें, एक दया जो आप कोड को प्रतिलिपि बनाने के बजाय FluentDateTime लाइब्रेरी से लिंक नहीं करते हैं (https://github.com/FluentDateTime/FluentDateTime/blob/master/FluentDateTime/DateTime/ DateTimeExtensions.cs)। मूल डेवलपर को कुछ क्रेडिट दें! – Jules

+0

@ जुल्स धन्यवाद, लिंक जोड़ने के लिए भूल गए! – Ogglas

संबंधित मुद्दे