2009-05-11 12 views
6

मैं जावा क्लास की तलाश में हूं जहां मैं दिनांक नियमों का एक सेट निर्दिष्ट कर सकता हूं, जैसे कि "हर तीसरे रविवार" और "हर सेकेंड सोमवार की पहली घटना महीना"। मैं इसके बारे में एक अनंत इटरेटर की तरह कुछ प्राप्त करने में सक्षम होना चाहता हूं (.next() नियम सेट से मेल खाने वाली अगली तारीख लौटाएगा)।जावा डेट इटरेटर फैक्ट्री, नियमों के साथ अंतराल की गणना कैसे करें

मुझे लगता है कि मैं इसे स्वयं बनाने में सक्षम हूं - लेकिन कैलेंडर एक परेशानी हैं, और ऐसा लगता है कि ऐसा कुछ पहले से मौजूद होना चाहिए। मुझे एक क्रैपीयर व्हील को फिर से शुरू करने के लिए एक होने से नफरत है।

क्या किसी को इस तरह से कुछ पता है? मैं जोडा को देख रहा हूं, और ऐसा लगता है कि इसके लिए आधारभूत कार्य है, लेकिन मुझे पूर्ण कार्यक्षमता देने की प्रतीत नहीं होती है ..

उत्तर

7

मुझे नहीं लगता कि जोडा-टाइम या जावा के लिए कोई आसानी से बनाया गया है उस मामले के लिए कैलेंडर एपीआई, हालांकि जोडा के साथ यह इतना आसान है कि आपको इसके साथ जाना चाहिए। उदाहरण के लिए बाद कुछ महीनों के ठहराव मैं लगभग 10 मिनट में बनाया के बाद Joda के साथ अपने आप को फिर से परिचित:

public class InstantIterator implements Iterator<Instant>, 
             Iterable<Instant> { 

    private Instant current; 
    private final Instant original; 
    private Duration skip; 
    private List<Instant> skipThese; 

    public InstantIterator(Instant startFrom, Duration skip) { 
     this.current = original = startFrom; 
     this.skip = skip; 
     skipThese = new Vector<Instant>(); 
    } 

    public boolean hasNext() { 
     return true; 
    } 

    public Instant next() { 
     Instant currentNext = current.toInstant(); 
     current = current.plus(skip); 
     while (skipThese.contains(currentNext)) { 
      currentNext = current.toInstant(); 
      current = current.plus(skip); 
     } 
     return currentNext; 
    } 

    public void remove() { 
     skipThese.add(current.toInstant()); 
    } 

    public Iterator<Instant> iterator() { 
     return this; 
    } 

    public void rewind() { 
     current = original.toInstant(); 
    } 

    public void resetRemoved() { 
     skipThese.clear(); 
    } 

    public void resetIterator() { 
     rewind(); 
     resetRemoved(); 
    } 
} 

Joda समय है भयानक :-)

+0

आपने मेरी दोपहर को हिलाया - धन्यवाद दोस्त! –

+0

हालांकि महत्वपूर्ण नहीं है, मैं सिर्फ यह कहना चाहता हूं कि यह दूसरा Iterator है जिसे मैंने कभी बनाया है जो हटाता है(), आमतौर पर मुझे इसका समर्थन करने के लिए बहुत बोझिल लगता है। – Esko

0

मेरी कंपनी something very much like you want है, लेकिन यह नेट के लिए इतना है यह शायद आपको कोई अच्छा नहीं करेगा।

0

आप Quartz पर एक नज़र डाल सकते हैं जो नौकरी शेड्यूलिंग के लिए डिज़ाइन किया गया है।

0

tl; डॉ

आसान, java.time साथ।

3 गुरुवार के लिए:

LocalDate.now().with(           // Get today's date, then adjust. 
    TemporalAdjusters.dayOfWeekInMonth(3 , DayOfWeek.THURSDAY) // Define adjuster to move to third Thursday of same month. 
)                 // Instantiates another `LocalDate` object (java.time uses immutable objects). 

java.time

परेशानी पुराने तिथि-समय जावा के जल्द से जल्द संस्करणों के साथ बंडल कक्षाएं java.time वर्गों द्वारा का स्थान ले लिया अब अप्रचलित कर रहे हैं।

LocalDate कक्षा समय-समय पर और समय क्षेत्र के बिना दिनांक-केवल मूल्य का प्रतिनिधित्व करती है। (: तीसरे गुरुवार, 2 मंगलवार, आदि पूर्व)

LocalDate ld = LocalDate.of(2018 , Month.FEBRUARY , 17) ; 

किसी भी LocalDate के लिए, आप एक ही महीने के भीतर एक दिन के सप्ताह के क्रमसूचक घटना में समायोजित कर सकते हैं। DayOfWeek enum का उपयोग करके दिन के सप्ताह निर्दिष्ट करें।

समायोजन करने के लिए, TemporalAdjusters कक्षा में पाए गए TemporalAdjuster कार्यान्वयन का उपयोग करें।

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​(3 , DayOfWeek.THURSDAY) ; // Third-Thursday. 

किसी भी LocalDate है कि समायोजक लागू करें, एक और LocalDate वस्तु का निर्माण किया।

LocalDate thirdThursday = ld.with(thirdThursdayAdjuster) ; 

कुछ इसे से बाहर एक अनंत इटरेटर की तरह (.next()

मिलान बस एक LocalDate दूसरे करने के लिए से स्थानांतरित अगले तारीख लौट आते हैं। आप LocalDate::addMonths कह सकते हैं।या यदि एक समय में एक महीने से निपटना है, तो YearMonth कक्षा का उपयोग करें।

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​(3 , DayOfWeek.THURSDAY) ; // Third-Thursday. 
List<LocalDate> dozenThirdThursdays = new ArrayList<>(12) ; 
YearMonth start = YearMonth.of(2018 , Month.MARCH) ; 
for(int i = 1 ; i <= 12 ; i ++) { 
    YearMonth ym = start.plusMonths(i) ; 
    LocalDate firstOfMonth = ym.atDay(1) ; 
    LocalDate thirdThursday = firstOfMonth.with(thirdThursdayAdjuster) ; 
    dozenThirdThursdays.add(thirdThursday) ; 
} 

java.time

बारे java.time ढांचे जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने legacy दिनांक-समय कक्षाएं जैसे java.util.Date, Calendar, & SimpleDateFormat प्रदान करती हैं।

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • java.time वर्गों के एंड्रॉयड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (ऊपर उल्लिखित) का अनुकूलन करता है। How to use ThreeTenABP… देखें।

ThreeTen-Extra परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के संभावित भविष्य के जोड़ों के लिए एक सिद्ध भूमि है। आपको यहां कुछ उपयोगी कक्षाएं मिल सकती हैं जैसे Interval, YearWeek, YearQuarter, और more