2011-12-31 8 views
55

में मुझे आश्चर्य है कि क्यों 'Y' रिटर्न 2012 जबकि 'y' रिटर्न 2011 SimpleDateFormat में:वाई रिटर्न 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 

किसी भी एक व्याख्या कर सकते हैं क्यों?

+21

भविष्य पाठकों के लिए एक नोट बस के रूप में: इस व्यवहार केवल साल के अंतिम सप्ताह या के पहले सप्ताह में होगा साल। – ryvantage

उत्तर

59

week year और वर्ष। Javadoc

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

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

+0

'$ तारीख बुध दिसंबर 30 00:42:51 यूटीसी 2015' ' $ तिथि +% जी 2015' '$ तिथि +% Y 2015' कुछ सॉफ्टवेयर उलझन में है:' strftime' आज की गणना करता है (12/29/2015) 2015 के रूप में सप्ताह 53, और सप्ताह के रूप में 2015 के रूप में। – aks

1

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

9

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

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

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

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

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

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

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

स्मार्ट मोड में, सभी तीन क्षेत्रों मान्य मान की अपनी सीमा के खिलाफ मान्य किए जाते हैं। सप्ताह के सप्ताह के आधार पर साल क्षेत्र 1 से 53 को मान्य है, जिसका अर्थ है कि जिसके परिणामस्वरूप तिथि निर्दिष्ट किया है कि के लिए निम्न सप्ताह आधारित साल में हो सकता है।

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

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

उदाहरण के लिए जावा 8 की DateFormatterBuilder, वातावरण के साथ पार्सर का दृष्टांत, और 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))); 
संबंधित मुद्दे