मेरे पास जावा में कैलेंडर देखने का एक तरीका है जो वर्ष, सप्ताह के दिन और सप्ताह-संख्या की तारीख की गणना करता है।

अब जब मैं 2017 की तारीखों की गणना करता हूं तो सब कुछ काम करता है। लेकिन जब मैं जनवरी 2018 से तारीखों की गणना करता हूं तो यह वर्ष 2017 की तारीखें लेता है।

मेरा कोड दिखता है

import java.time.temporal.IsoFields;
import java.time.temporal.ChronoField;
import java.time.LocalDate;

// .....

LocalDate desiredDate = LocalDate.now()
                    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1)
                    .with(ChronoField.DAY_OF_WEEK, 1)
                    .withYear(2018);

जिसका परिणाम 2018-01-02 है और यह 2018-01-01 होना चाहिए। यह कैसे संभव है?

9
JimmyD 13 नवम्बर 2017, 10:38

2 जवाब

सबसे बढ़िया उत्तर

लागू किए गए तरीकों का क्रम मायने रखता है।
यह आप उन्हें अवरोही समय-ग्रैन्युलैरिटी (वर्ष, सप्ताह का सप्ताह और सप्ताह का दिन) द्वारा आमंत्रित करते हैं, आपको सही परिणाम मिलता है:

long weekNumber = 1;
long dayOfWeek = 1;
int year = 2018;

LocalDate desiredDate = LocalDate.now()
    .withYear(year)
    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
    .with(ChronoField.DAY_OF_WEEK, dayOfWeek );

System.out.println(desiredDate);

2018-01-01

ध्यान दें कि समस्या की उत्पत्ति निम्न से होती है:

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)

जो चालू वर्ष के अनुसार सप्ताह संख्या (1 to 53) निर्धारित करता है।
जावा LocalDate API इस मान को अनुकूलित नहीं कर सकता यदि आप वर्ष को .withYear(year) के साथ बदलते हैं क्योंकि सप्ताह संख्या की जानकारी LocalDate उदाहरण में नहीं रखी जाती है।

आप वास्तव में LocalDate कार्यान्वयन में देख सकते हैं कि LocalDate उदाहरण केवल 3 फ़ील्ड द्वारा परिभाषित किए गए हैं: year, month और day

public final class LocalDate
        implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable {
    ...
    private final int year;
    /**
     * The month-of-year.
     */
    private final short month;
    /**
     * The day-of-month.
     */
    private final short day;
    ...
}

तो सटीक होने के लिए, महत्वपूर्ण बात यह है कि:

.withYear(year) को पहले बुलाया जाए

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber);
12
davidxxx 13 नवम्बर 2017, 11:49

मैं उल्लेख करना चाहता हूं कि लोकलडेट के साथ एक और समस्या (?) है।

यह कोड गलत परिणाम भी देता है:

    int jahr = Integer.parseInt(str[0]);
    int woche = Integer.parseInt(str[1]);

    LocalDate year = LocalDate.of(jahr, 1, 1);
    LocalDate week = year.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, woche);
    LocalDate day = week.with(wochentag);
    return day;

यदि आप year चर के निर्माण को बदलते हैं

 LocalDate year = LocalDate.now().withYear(jahr);

कोड अपेक्षित परिणाम देता है। ऐसा लगता है कि जिस तरह से आप स्थानीयडेट मामलों का निर्माण करते हैं। मुझे लगता है कि टाइमज़ोन ".of ()" संस्करण में छोड़ा गया है।

2
KFleischer 25 फरवरी 2019, 19:27