2011-12-12 12 views
6

मैं PaymentFrequency जिनके मान से संकेत मिलता है कि कितने भुगतान प्रति वर्ष किए जा रहे हैं कहा जाता है एक enum प्रकार है ... तो मैं पर NumberOfPayments आधारकितने दिन के लिए जोड़ने के लिए "अर्द्ध मासिक"

public enum PaymentFrequency 
{ 
    None    = 0, 
    Annually   = 1, 
    SemiAnnually  = 2, 
    EveryFourthMonth = 3, 
    Quarterly  = 4, 
    BiMonthly  = 6, 
    Monthly   = 12, 
    EveryFourthWeek = 13, 
    SemiMonthly  = 24, 
    BiWeekly   = 26, 
    Weekly   = 52 
} 

है, PaymentFrequency, और FirstPaymentDate (दिनांक दिनांक प्रकार ऑफसेट) का प्रकार मैं LastPaymentDate की गणना करना चाहता हूं। लेकिन मैं कितने समय इकाइयों (दिन, महीने) दो हफ़्ते का के मामले में जोड़ने के लिए पता लगाना मुद्दा हो रहा है ...

switch (paymentFrequency) 
    { 
     // add years... 
     case PaymentFrequency.Annually: 
      LastPaymentDate = FirstPaymentDate.AddYears(NumberOfPayments - 1); 
      break; 
     // add months... 
     case PaymentFrequency.SemiAnnually: 
      LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) * 6); // 6 months 
      break; 
     case PaymentFrequency.EveryFourthMonth: 
      LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) * 4); // 4 months 
      break; 
     case PaymentFrequency.Quarterly: 
      LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) * 3); // 3 months 
      break; 
     case PaymentFrequency.BiMonthly: 
      LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) * 2); // 2 months 
      break; 
     case PaymentFrequency.Monthly: 
      LastPaymentDate = FirstPaymentDate.AddMonths(NumberOfPayments - 1); 
      break; 
     // add days... 
     case PaymentFrequency.EveryFourthWeek: 
      LastPaymentDate = FirstPaymentDate.AddDays((NumberOfPayments - 1) * 4 * 7); // 4 weeks (1 week = 7 days) 
      break; 
     case PaymentFrequency.SemiMonthly: 
      // NOTE: how many days in semi month? AddMonths (0.5) does not work :) 
      LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1) * 0.5); // 2 weeks (1 week = 7 days) 
      break; 
     case PaymentFrequency.BiWeekly: 
      LastPaymentDate = FirstPaymentDate.AddDays((NumberOfPayments - 1) * 2 * 7); // 2 weeks (1 week = 7 days) 
      break; 
     case PaymentFrequency.Weekly: 
      LastPaymentDate = FirstPaymentDate.AddDays((NumberOfPayments - 1) * 7); // 1 week (1 week = 7 days) 
      break; 
     case PaymentFrequency.None: 
     default: 
      throw new ArgumentException("Payment frequency is not initialized to valid value!", "paymentFrequency"); 
    } 

तो, कितने दिन/महीने मैं जब दो हफ़्ते का उपयोग करते हुए इस्तेमाल करना चाहिए? क्या यह हर महीने के लिए सटीक # दिनों के बिना भी संभव है? या यह वास्तव में सरल है, और मैंने सिर्फ कैफीन से बाहर भाग लिया है और मैं पेड़ों के लिए जंगल नहीं देख रहा हूं :)

+6

सेमी-मासिक के लिए आपकी व्यावसायिक आवश्यकता क्या है? हर महीने कौन सा दो दिन? क्या वे तय हैं? या बस हमेशा 2 अलग-अलग दिन 15 दिन अलग (यानी।2 और 17, 3 और 18, 4 और 1 9, 5 और 20, आदि) –

+0

@ जेम्स माइकल हारे प्रश्न के लिए 1 और 16 वें कहते हैं। मुझे लगता है कि मुझे पता है कि यह कहां जा रहा है ... – zam6ak

+0

और क्या आप जानते हैं कि आपका पहला भुगतान महीना हमेशा सही ढंग से 1 पर गिर जाएगा? –

उत्तर

7

अर्द्ध मासिक के लिए चुनते हैं, तो आपका पहला भुगतान हमेशा साथ ही महीने की 1 भुगतान था यदि (है कि, किसी भी समय से है के रूप में टिप्पणी में चर्चा की 13 वीं करने के लिए 1, 13 के बाद शुरू होने वाले समस्याग्रस्त है), तो आप इस प्रकार कर सकता है:

// assuming first payment will be 1st of month, add month for every 2 payments 
// num payments/2 (int division, remainder is chucked) 
// then add 15 days if this is even payment of the month 
LastPaymentDate = FirstPaymentDate.AddMonths((NumberOfPayments - 1)/2) 
    .AddDays((NumberOfPayments % 2) == 0 ? 15 : 0); 

तो 1 भुगतान के लिए, इस 0 महीने और 0 दिनों तो 1 भुगतान तिथि हो जोड़ देगा। दूसरे भुगतान के लिए, इसमें 0 महीने (int dividision, शेष चकित किया जाएगा) और 16 महीने के लिए 15 दिन जोड़े जाएंगे। तीसरे भुगतान के लिए, यह अगले महीने के 1 महीने (1/3) और 0 दिन जोड़ देगा, आदि

यह माना जाता है कि फर्स्टपेमेंटडेट कुछ महीने के पहले में होगा। यदि आप 16 वीं को प्रारंभिक तिथि, आदि की अनुमति देना चाहते हैं तो आप शायद यहां से कहां से जाना चाहते हैं।

समझ में आना?

तो वर्णन करने के लिए, अगर हम था:

DateTime LastPaymentDate, FirstPaymentDate = new DateTime(2011, 12, 5); 

for(int numOfPayments=1; numOfPayments<=24; numOfPayments++) 
{ 
    LastPaymentDate = FirstPaymentDate.AddMonths((numOfPayments - 1)/2) 
     .AddDays((numOfPayments % 2) == 0 ? 15 : 0); 

    Console.WriteLine(LastPaymentDate); 
} 

इस पाश हमें देना होगा:

12/5/2011 12:00:00 AM 
12/20/2011 12:00:00 AM 
1/5/2012 12:00:00 AM 
// etc... 
10/20/2012 12:00:00 AM 
11/5/2012 12:00:00 AM 
11/20/2012 12:00:00 AM 
+0

अच्छा, धन्यवाद ... अगर मैं उपयोगकर्ता निर्दिष्ट अर्द्ध मासिक तिथियां (1-15, 2-16, 3-17, इत्यादि) चाहता हूं तो मुझे बस बीमा करना होगा 1) दिनांक diff = 15 दिन और 2) दूसरे भाग में दूसरे दिन का उपयोग करें? – zam6ak

+0

@ zam6ak: हाँ, दूसरी तारीख हमेशा देखी गई किसी अर्ध-मासिक योजना में पहली बार से 15 दिन है। दूसरा भाग हमेशा शाब्दिक 15 है। यही है, '== 0? 15: 0 'कोड का हिस्सा 15 दिनों को जोड़ना है, इसका मतलब 15 वां नहीं है। इस प्रकार, यह तर्क हमेशा किसी भी शुरुआती दिन के लिए काम करता है जो 13 वें (13 वें से अधिक है जो आप फरवरी को गड़बड़ करना शुरू करते हैं ...) –

+0

@ zam6ak: क्या यह समझ में आता है? तो अगर फर्स्टपेमेंटडेट 12/05/2011 है, तो यह आपको 12/05/2011 और 12/20/2011 को सही तरीके से देगा। * केवल * स्थान जो आप समस्याओं में भाग लेते हैं वह यह है कि यदि प्रारंभिक तिथि> 13 है, तो तब आपको फरवरी के साथ समस्या होगी। –

1

क्योंकि महीनों में अलग-अलग लंबाई होती है, आप केवल पूर्व परिभाषित संख्या नहीं जोड़ सकते हैं। आपको पता होना चाहिए कि आप किस महीने से काम कर रहे हैं, और वहां से चले जाओ।

यदि आप जानते हैं कि एक महीने का पहला और 16 वां तारीख देय है, तो आखिरी भुगतान 16 दिसंबर है (माना जाता है कि आप कैलेंडर वर्ष की गणना कर रहे हैं)।

+0

डैनियल - अंतिम भुगतान तिथि NumberOf भुगतान पर निर्भर करता है। तो यदि मेरे पास 48 भुगतानों के साथ अर्द्ध मासिक आवृत्ति है, और 01/01/1978 के फर्स्टपेमेंटडेट के साथ - अंतिम भुगतान तिथि क्या होगी .... मुझे लगता है कि, अन्य मामलों के विपरीत, सेमीिमोनथली के साथ मुझे 2 तिथियां और "चलना" प्रत्येक भुगतान ... – zam6ak

+0

केवल 4 मामले हैं: पहला भुगतान महीने के पहले और नंबरऑफमेंट्स अजीब है; पहला भुगतान महीने के 16 वें स्थान पर है और नंबरऑफपेमेंट्स अजीब है; पहला भुगतान महीने के पहले और नंबरऑफपेमेंट्स पर भी है; पहला भुगतान महीने के 16 वें स्थान पर है और नंबरऑफपेमेंट्स घटना है। किसी भी मामले में अंतिम भुगतान या तो पहले या 16 वें स्थान पर होगा। तो, आप प्रत्येक महीने को 2 टुकड़ों में विभाजित कर सकते हैं: 1-15, महीने के 16-अंत। प्रति माह 2 अवधि, और आपको केवल गणना करने की आवश्यकता है कि भुगतान समाप्त करने के लिए कितनी अवधि की आवश्यकता है। –

0

अर्द्ध मासिक भुगतान के लिए बुनियादी जोड़े हैं:

  • 1 और 16 (1 और एक महीने के 16 वें दिन)
  • 15 और (2 | 3)? (15 वीं और महीने के अंतिम दिन)

पीक और

0

मैं हाल ही में एक ही मुद्दा मिला है, लेकिन मैं किसी भी तारीख इनपुट अनुमति दे सके। यह एक गड़बड़ है और इसे फिर से काम करने की जरूरत है, लेकिन यह वही है जो मैं अब तक आया था। फरवरी में कुछ समस्याएं थीं जिन्हें मुझे हैक करना था।

Date returnDate; 

if (numberOfPayments % 2 == 0) 
{ 
    returnDate = date.AddMonths(numberOfPayments/2); 

    if (date.Day == DateTime.DaysInMonth(date.Year, date.Month))//Last day of the month adjustment 
    { 
     returnDate = new Date(returnDate.Year, returnDate.Month, DateTime.DaysInMonth(returnDate.Year, returnDate.Month)); 
    } 
} 
else 
{ 
    returnDate = date.Day <= 15 ? date.AddDays(15).AddMonths((numberOfPayments - 1)/2) : date.AddDays(-15).AddMonths((numberOfPayments + 1)/2); 
    if (date.Day == DateTime.DaysInMonth(date.Year, date.Month))//Last day of the month adjustment 
    { 
     returnDate = new Date(returnDate.Year, returnDate.Month, 15); 
    } 
    else if (date.Month == 2 && date.Day == 14) 
    { 
     returnDate = returnDate.AddMonths(-1); 
     returnDate = new Date(returnDate.Year, returnDate.Month, returnDate.Month == 2 ? 28 : 29); 
    } 
    else if (date.Month == 2 && date.Day == 15) 
    { 
     returnDate = returnDate.AddMonths(-1); 
     returnDate = new Date(returnDate.Year, returnDateMonth, DateTime.DaysInMonth(returnDate.Year, returnDate.Month)); 
    } 
} 

return returnDate; 
संबंधित मुद्दे