2010-05-01 18 views
6

मैं किसी घटना के समाप्ति दिनांक (और समय) की गणना करना चाहता हूं। मुझे प्रारंभ दिनांक और अवधि (मिनटों में) पता है। लेकिन:छुट्टियों को छोड़ते समय समाप्ति तिथि की गणना + जोडा समय

  1. मैं छुट्टियों को छोड़ करने के लिए है - गैर आवर्ती स्थिति
  2. मैं सप्ताहांत को छोड़ करने के लिए है - आवर्तक स्थिति
  3. मैं नहीं गिनती काम कर समय (उदाहरण के लिए: 8:00 से 5 तक : 00 अपराह्न) - आवर्ती स्थिति, लेकिन बेहतर ग्रैन्युलरिटी

क्या जोडा समय पुस्तकालय का उपयोग करके इन मामलों को प्राप्त करने का कोई आसान तरीका है?

उत्तर

2

जोडाटाइम आपकी मदद करेगा - मैं बहुत कुछ कहूंगा- लेकिन आपको खुद को तर्क लिखना होगा, कुछ लूप छोड़कर कुछ दिनों और कुछ बार दिन का। बहुत आसान नहीं, न तो बहुत जटिल, ऐसा लगता है।

+0

स्वीकृत उत्तर के रूप में चिह्नित, क्योंकि यह सच है। मेरे शोध के अनुसार, कोई आसान समाधान नहीं है। और जोडाटाइम निश्चित रूप से सहायक है। – picca

1

सबसे पहले आपको "छुट्टियां" परिभाषित करना होगा। प्रत्येक लोकेल में समान नहीं होते हैं, इसलिए इसे सामान्य और प्लग करने योग्य बनाना होता है।

मुझे नहीं लगता कि यह "सरल" है।

+0

मेरे मामले में छुट्टियों को डेटाबेस में संग्रहीत किया जाता है। लेकिन मैं यह इंगित करना चाहता था कि मैं इसका उपयोग नहीं कर सकता: अगर (dayofweek() == 7) {skip(); } – picca

1

क्या आपने Holiday calculation प्रोजेक्ट देखा है? यह जोडाटाइम से संबंधित परियोजनाओं में दिखाया गया है और उपयोगी हो सकता है

+0

वास्तव में अच्छा लगता है। लेकिन मुझे अभी भी पता नहीं है कि कामकाजी घंटों को कैसे संभालना है। मुझे मूल रूप से एन-मिनट द्वारा दी गई तारीख को तेज़ी से आगे बढ़ाने की आवश्यकता है। कामकाजी घंटों, छुट्टियां, आदि छोड़ना ... – picca

0

यहां कुछ कोड है जिसका मैं उपयोग करता हूं। dtDateTimes में आपकी पूर्व परिभाषित अवकाश तिथियां हो सकती हैं (उदा। यूके बैंक छुट्टियां) और dtConstants में पुनरावर्ती चीजें हो सकती हैं, जिन्हें आप DateTimeConstants.SATURDAY के साथ मेल करना चाहते हैं।

/** 
* Returns a tick for each of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* occurring in the period as represented by begin -> end. 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
* @return 
*/ 
public int numberOfOccurrencesInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    int counter = 0; 
    for (DateTime current = begin; current.isBefore(end); current = current.plusDays(1)) { 
     for (Integer constant : dtConstants) { 
      if (current.dayOfWeek().get() == constant.intValue()) { 
       counter++; 
      } 
     } 
     for (DateTime dt : dtDateTimes) { 
      if (current.getDayOfWeek() == (dt.getDayOfWeek())) { 
       counter++; 
      } 
     } 

    } 
    return counter; 
} 

/** 
* Returns true if the period as represented by begin -> end contains any one of 
* the dates as represented by the <code>dtConstants</code> or the list of <code>dtDateTimes</code> 
* 
* @param begin 
* @param end 
* @param dtConstants 
* @param dtDateTimes 
*/ 
public boolean isInPeriod(final DateTime begin, final DateTime end, List<Integer> dtConstants, List<DateTime> dtDateTimes) { 
    return numberOfOccurrencesInPeriod(begin, end, dtConstants, dtDateTimes) > 0; 
} 
संबंधित मुद्दे