Y 2012 में लौटता है जबकि y 2011 में SimpleDateFormat में लौटता है


85

मुझे आश्चर्य है कि 2011 Y ’2012 में क्यों लौटता है जबकि 'y’ 2011 में लौटता है SimpleDateFormat:

System.out.println(new SimpleDateFormat("Y").format(new Date())); // prints 2012
System.out.println(new SimpleDateFormat("y").format(new Date())); // prints 2011

क्या कोई समझा सकता है क्यों?


36
भविष्य के पाठकों के लिए एक नोट के रूप में: यह व्यवहार केवल वर्ष के अंतिम सप्ताह या वर्ष के पहले सप्ताह के दौरान होगा।
19

जवाबों:


90

सप्ताह वर्ष और वर्ष। जावदोक से

एक सप्ताह का वर्ष WEEK_OF_YEAR चक्र के साथ सिंक में है। पहले और अंतिम सप्ताह (समावेशी) के बीच के सभी सप्ताह का सप्ताह का मूल्य समान होता है। इसलिए, सप्ताह के पहले और आखिरी दिनों में अलग-अलग कैलेंडर वर्ष मान हो सकते हैं।

उदाहरण के लिए, 1 जनवरी, 1998 गुरुवार है। यदि getFirstDayOfWeek () MONDAY है और getMinimalDaysInFirstWeek () 4 (ISO 8601 मानक संगत सेटिंग) है, तो 1998 का ​​सप्ताह 1 दिसंबर 29, 1997 को शुरू होता है, और 4 जनवरी 1998 को समाप्त होता है। सप्ताह का अंतिम दिन अंतिम तीन दिनों के लिए 1998 है। वर्ष 1997 का कैलेंडर। यदि, हालांकि, GetFirstDayOfWeek () SUNDAY है, तो 1998 का ​​सप्ताह 1 जनवरी 4, 1998 को शुरू होता है, और 10 जनवरी 1998 को समाप्त होता है; 1998 के पहले तीन दिन फिर 1997 के सप्ताह 53 का हिस्सा हैं और उनका सप्ताह वर्ष 1997 है।


$ date Wed Dec 30 00:42:51 UTC 2015 $ date +%G 2015 $ date +%Y 2015 कुछ सॉफ्टवेयर उलझन में हैं: strftimeआज (12/29/2015) सप्ताह 53 के रूप में गणना करता है, और सप्ताह-वर्ष 2015 के रूप में
aks

11

यहाँ कुछ कोड के साथ जावा 8 अपडेट है, क्योंकि ग्रेगोरियन कैलेन्डर को संभवतः भविष्य के JDK संस्करणों से हटा दिया जाएगा या हटा दिया जाएगा।

नया कोड WeekFieldsकक्षा में संभाला जाता है , और विशेष रूप से निचले मामले y/ ऊपरी मामले Yके लिए weekBasedYear()फ़ील्ड एक्सेसर के साथ।

इस वीकफ़िल्ड्स के आधार पर सप्ताह-आधारित-वर्ष के वर्ष तक पहुंचने के लिए एक फ़ील्ड देता है। यह उस वर्ष की अवधारणा का प्रतिनिधित्व करता है जहां सप्ताह एक निश्चित दिन के सप्ताह से शुरू होता है, जैसे कि सोमवार और प्रत्येक सप्ताह ठीक एक वर्ष से संबंधित है। यह फ़ील्ड आमतौर पर dayOfWeek () और weekOfWeekBasedYear () के साथ उपयोग की जाती है।

सप्ताह एक (1) सप्ताह है, जो GetFirstDayOfWeek () पर शुरू हो रहा है, जहाँ वर्ष में कम से कम getMinimalDaysInFirstWeek () दिन होते हैं। इस प्रकार, सप्ताह एक वर्ष की शुरुआत से पहले शुरू हो सकता है। यदि पहला सप्ताह वर्ष की शुरुआत के बाद शुरू होता है तो इससे पहले की अवधि पिछले वर्ष के अंतिम सप्ताह में होती है।

इस क्षेत्र का उपयोग किसी भी कैलेंडर प्रणाली के साथ किया जा सकता है।

पार्सिंग के समाधान के चरण में, एक सप्ताह-आधारित वर्ष, सप्ताह के वर्ष और दिन के सप्ताह से एक तारीख बनाई जा सकती है।

सख्त मोड में, सभी तीन फ़ील्ड उनके मान्य मानों की श्रेणी के विरुद्ध मान्य हैं। सप्ताह का वर्ष क्षेत्र यह सुनिश्चित करने के लिए मान्य है कि परिणामी सप्ताह-आधारित वर्ष अनुरोधित सप्ताह-आधारित वर्ष है।

स्मार्ट मोड में, सभी तीन फ़ील्ड उनके मान्य मानों की श्रेणी के विरुद्ध मान्य हैं। सप्ताह-दर-सप्ताह-आधारित वर्ष फ़ील्ड 1 से 53 तक मान्य है, जिसका अर्थ है कि परिणामी तिथि अगले सप्ताह-आधारित वर्ष में उस निर्दिष्ट तक हो सकती है।

उदार मोड में, वर्ष और दिन-सप्ताह मान्य मानों की श्रेणी के विरुद्ध मान्य हैं। परिणामी तिथि की गणना निम्नलिखित तीन चरण दृष्टिकोण के बराबर की जाती है। सबसे पहले, अनुरोधित सप्ताह-आधारित वर्ष में पहले सप्ताह के पहले दिन की तारीख बनाएं। फिर सप्ताह-दर-सप्ताह-आधारित वर्ष लें, एक को घटाएं और सप्ताह में तारीख में राशि जोड़ें। अंत में, स्थानीयकृत सप्ताह के भीतर सही दिन-सप्ताह में समायोजित करें।

इस WeekFieldsउदाहरण की स्थापना स्थान पर निर्भर करती है और इसके आधार पर अलग-अलग सेटिंग्स हो सकती हैं, अमेरिका और फ्रांस जैसे यूरोपीय देशों में सप्ताह की शुरुआत के रूप में एक अलग दिन हो सकता है।

DateFormatterBuilderजावा 8 के उदाहरण के लिए , पार्सर को लोकेल के साथ त्वरित करें, और Yप्रतीक के लिए इस लोकेल का उपयोग करें :

public final class DateTimeFormatterBuilder {
    ...

    private void parsePattern(String pattern) {
        ...
                } else if (cur == 'Y') {
                    // Fields defined by Locale
                    appendInternal(new WeekBasedFieldPrinterParser(cur, count));
                } else {
        ...


    static final class WeekBasedFieldPrinterParser implements DateTimePrinterParser {
        ...

        /**
         * Gets the printerParser to use based on the field and the locale.
         *
         * @param locale  the locale to use, not null
         * @return the formatter, not null
         * @throws IllegalArgumentException if the formatter cannot be found
         */
        private DateTimePrinterParser printerParser(Locale locale) {
            WeekFields weekDef = WeekFields.of(locale);
            TemporalField field = null;
            switch (chr) {
                case 'Y':
                    field = weekDef.weekBasedYear();
                    if (count == 2) {
                        return new ReducedPrinterParser(field, 2, 2, 0, ReducedPrinterParser.BASE_DATE, 0);
                    } else {
                        return new NumberPrinterParser(field, count, 19,
                                                       (count < 4) ? SignStyle.NORMAL : SignStyle.EXCEEDS_PAD, -1);
                    }
                case 'e':
                case 'c':
                    field = weekDef.dayOfWeek();
                    break;
                case 'w':
                    field = weekDef.weekOfWeekBasedYear();
                    break;
                case 'W':
                    field = weekDef.weekOfMonth();
                    break;
                default:
                    throw new IllegalStateException("unreachable");
            }
            return new NumberPrinterParser(field, (count == 2 ? 2 : 1), 2, SignStyle.NOT_NEGATIVE);
        }

        ...
    }

    ...
}

यहाँ कुछ उदाहरण है

System.out.format("Conundrum                         : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'")));
System.out.format("Solution                          : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmms'S'")));


System.out.format("JVM Locale first day of week      : %s%n",
                  WeekFields.of(Locale.getDefault()).getFirstDayOfWeek());
System.out.format("US first day of week              : %s%n",
                  WeekFields.of(Locale.US).getFirstDayOfWeek());
System.out.format("France first day of week          : %s%n",
                  WeekFields.of(Locale.FRANCE).getFirstDayOfWeek());
System.out.format("JVM Locale min days in 1st week   : %s%n",
                  WeekFields.of(Locale.getDefault()).getMinimalDaysInFirstWeek());
System.out.format("US min days in 1st week           : %s%n",
                  WeekFields.of(Locale.US).getMinimalDaysInFirstWeek());
System.out.format("JVM Locale min days in 1st week   : %s%n",
                  WeekFields.of(Locale.FRANCE).getMinimalDaysInFirstWeek());

System.out.format("JVM Locale week based year (big Y): %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("France week based year (big Y)    : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.FRANCE).weekBasedYear()));
System.out.format("US week based year (big Y)        : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC")).get(WeekFields.of(Locale.US).weekBasedYear()));

और स्थान और अपर केस के संबंध में Y, आप या तो कमांड लाइन विकल्प के साथ खेल सकते हैं -Duser.language=( fr, en, es, आदि), या मंगलाचरण समय में स्थान के लिए मजबूर:

System.out.format("English localized                 : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.ENGLISH)));
System.out.format("French localized                  : %s%n",
                  ZonedDateTime.of(2015, 12, 30, 0, 0, 0, 0, ZoneId.of("UTC"))
                               .format(DateTimeFormatter.ofPattern("YYYYMMdd'T'HHmms'S'", Locale.FRENCH)));

5

Yसप्ताह का वर्ष पाने के लिए प्रारूप यदि कैलेंडर वर्ष सप्ताह का समर्थन करता है। ( getCalendar().isWeekDateSupported())


1

मैं मुश्किल तरीके से JSTL टैग पुस्तकालय सीखा format:dateके साथ shortके रूप में अनुरोध प्रारूप कवर के तहत YYYY उपयोग करता है। जो वास्तव में मुद्रित तिथि को एक वर्ष आगे बढ़ा सकता है।


0

मैं एक तारीख आगे और पीछे परिवर्तित करता हूं - आप उसी वर्ष की अपेक्षा करेंगे जब आप ऐसा करेंगे।

ध्यान दें कि यह कैसे आगे बढ़ता है!

यह बुरा है: YYYY! YYYY

आप इसे यहां चला सकते हैं

import java.util.Date;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static java.lang.System.out;
class Playground {
    public static Date convertYYYYMMDDStr(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date result = null;
        try {
            result = sdf.parse(s);
        } catch(ParseException e) {
            e.printStackTrace();
        }
        return result;
    }
    public static String formatDateToStrWithSDF(Date d, SimpleDateFormat s) {
        return s.format(d);
    }
    public static void main(String[ ] args) {
        // DON'T DO. Use yyyy instead of YYYY
        SimpleDateFormat sdfdmy = new SimpleDateFormat("dd-MM-YYYY"); 
        String jan1st2020sb = "2020-01-01";
        Date jan1st2020d = convertYYYYMMDDStr(jan1st2020sb);
        String jan1st2020sa = formatDateToStrWithSDF(jan1st2020d, sdfdmy);
        out.println(jan1st2020sb);
        out.println(jan1st2020d);
        out.println(jan1st2020sa);
        String dec31st2020sb = "2020-12-31";
        Date dec31st2020d = convertYYYYMMDDStr(dec31st2020sb);
        String dec31st2020sa = formatDateToStrWithSDF(dec31st2020d, sdfdmy);
        out.println(dec31st2020sb);
        out.println(dec31st2020d);
        out.println(dec31st2020sa);
    }
}

यह अच्छा है: yyyy

yyyy

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.