calendar के - कैलेंडर का उपयोग करते हुए जावा 7 में तिथियों की तुलना करना




नाम वार (2)

Date कन्स्ट्रक्टर (जैसा कि आप उपयोग कर रहे हैं: new Date(2017,1,1) ) न केवल बहिष्कृत किए गए हैं (इसलिए आपको उनसे बचना चाहिए) बल्कि भ्रामक भी हैं, क्योंकि साल 1 9 00 में इंडेक्स किए गए हैं (ऐसा 2017 हो जाता है 3 9 17) और महीनों शून्य-अनुक्रमित हैं (मूल्य सीमा शून्य (जनवरी) से 11 (दिसंबर)) हैं। तो ऐसा लगता है जैसे आप सोचते हैं:

Date start = new Date(2017, 1, 1); // February 1st 3917
Date end = new Date(2017, 6, 30); // July 30th 3917

जब आप start करने के लिए 6 महीने जोड़ते हैं, तो यह 1 अगस्त , जो end बाद end

1 जनवरी और जून 30 को बनाने के लिए आपको month - 1 उपयोग करना होगा month - 1 और वर्ष 2017 का उपयोग करना आपको 117 (2017-1900) का उपयोग करना होगा:

Date start = new Date(117, 0, 1); // January 1st 2017
Date end = new Date(117, 5, 30); // June 30th 2017

हालांकि, start 6 महीने 1 जुलाई होगा, जो अब भी end बाद है (इसलिए आपका कोड अपवाद फेंक देगा)।

पुरानी कक्षाएं ( Date , Calendar और SimpleDateFormat ) में बहुत सी समस्याओं और डिजाइन समस्याएं हैं , और उन्हें नए एपीआई द्वारा प्रतिस्थापित किया जा रहा है।

जावा <= 7 में , आप थ्रीटीन बॅकपोर्ट , जावा 8 की नई तारीख / समय कक्षाओं के लिए एक महान बैकपोर्ट का उपयोग कर सकते हैं।

अलग-अलग स्थितियों से निपटने के लिए इस नई एपीआई में कई नई तारीख और समय प्रकार हैं जैसा कि हम केवल दिनांक (दिन / महीने / वर्ष) के साथ काम कर रहे हैं, हम एक org.threeten.bp.LocalDate उपयोग कर सकते हैं:

LocalDate start = LocalDate.of(2017, 1, 1); // January 1st 2017
LocalDate end = LocalDate.of(2017, 6, 30); // June 30th 2017

// 6 months after start
LocalDate sixMonthsLater = start.plusMonths(6);
if (sixMonthsLater.isAfter(end)) {
    // throw exception
}

मैं 6 महीनों से अधिक समय तक रहता है या नहीं, यह जांचने के लिए एक अंतराल की प्रारंभ तिथि की तुलना कर रहा हूं। यदि अवधि फरवरी के महीने को शामिल नहीं करती है तो सभी अच्छी हैं, लेकिन अगर मैं 1 जनवरी की 30 जून को तुलना करता हूं, तो मेरी अपवाद फेंकता है। दोनों अवधि की तुलना करने के लिए मैं शुरू की तारीख तक 6 महीने जोड़ता हूं और परिणाम की समाप्ति तिथि से तुलना कीजिए:

Date start = new Date(2017,1,1);
Date end = new Date(2017,6,30);

Calendar startOfTreatment = new Calendar.getInstance();
startOfTreatment.setTime(start);

Calendar endOfTreatment = new Calendar.getInstance();
endOfTreatment.setTime(end);

startOfTreatment.add(Calendar.MONTH, 6);
if (startOfTreatment.compareTo(endOfTreatment) > 0) {
    throw new InfinishedTreatmentException(startOfTreatment,endOfTreatment);
}

मैं इसे कैसे ठीक करूं?


यह शायद एक हैक है, लेकिन निम्नलिखित ने मेरे लिए काम किया:

URI uri = getClass().getResource("myresourcefile.txt").toURI();

if("jar".equals(uri.getScheme())){
    for (FileSystemProvider provider: FileSystemProvider.installedProviders()) {
        if (provider.getScheme().equalsIgnoreCase("jar")) {
            try {
                provider.getFileSystem(uri);
            } catch (FileSystemNotFoundException e) {
                // in this case we need to initialize it first:
                provider.newFileSystem(uri, Collections.emptyMap());
            }
        }
    }
}
Path source = Paths.get(uri);

यह इस तथ्य का उपयोग करता है कि ZipFileSystemProvider आंतरिक रूप से URI द्वारा खोले गए फ़ाइल सिस्टम की एक सूची संग्रहीत करता है।