java जावा की तिथि क्यों है.getYear() 2011 के बजाय 111 लौटाता है?




date calendar (5)

मुझे Date ऑब्जेक्ट को स्ट्रिंग डेट को पार्स करने में कुछ परेशानी हो रही है। मैं स्ट्रिंग को पार्स करने के लिए DateFormat का उपयोग करता हूं, और जब मैं तिथि के मूल्य को प्रिंट करता हूं, तो यह मुझे वह देता है जो मैं उम्मीद करता हूं।

लेकिन जब मैं दिन, महीने या वर्ष प्राप्त करने का प्रयास करता हूं तो यह मुझे गलत मूल्य देता है। उदाहरण के लिए, वर्ष 2011 है, लेकिन जब मैं करता .getYear() यह मुझे 111 देता है। मुझे नहीं पता कि यह क्यों हो रहा है। प्रासंगिक कोड सेगमेंट यहां दिया गया है:

    Date dateFrom = null;

    String gDFString = g.getDateFrom();

    System.out.println(gDFString);

    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    try {
        dateFrom = df.parse("04/12/2011");

        System.out.println(dateFrom);

        System.out.println(dateFrom.getYear());
    } catch (ParseException e) {
        e.printStackTrace();
    }

जब मैं प्रिंट dateFrom , तो मुझे Sun Dec 04 00:00:00 GMT 2011 , जो आप उम्मीद करेंगे। लेकिन प्रिंटिंग .getYear() 111 देता है।

मुझे एक समय श्रृंखला ग्राफ के लिए तारीख का दिन, महीना और वर्ष प्राप्त करने में सक्षम होना चाहिए।


tl; डॉ

int year = 
    LocalDate.parse( 
        "04/12/2011" , 
        DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US ) 
    ).getYear() ;  

2011

java.time

परेशानी java.util.Date वर्ग और उसके भाई बहन अब उत्कृष्ट java.time कक्षाओं द्वारा आपूर्ति की जाती हैं।

String input = "04/12/2011";
Locale locale = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale );
LocalDate ld = LocalDate.parse( input , f );

जावा.टाइम क्लासेस सेन नंबरिंग का उपयोग करते हैं, इसके साथ:

  • जनवरी-दिसंबर के लिए महीनों 1-12
  • 2011 का मतलब 2011 है
  • सोमवार-रविवार (प्रति आईएसओ 8601 ) के लिए सप्ताह के दिन 1-7 हैं।

LocalDate घटक को अपने घटक भागों के लिए पूछताछ करें।

int year = ld.getYear();  // 2011
int month = ld.getMonthValue();  // 4
int dayOfMonth = ld.getDayOfMonth();  // 12

आप महीने के स्वचालित रूप से नामित नाम और सप्ताह के नाम के लिए भी पूछ सकते हैं।

String monthName = ld.getMonth().getDisplayName( TextStyle.FULL_STANDALONE , Locale.CANDA_FRENCH ); // avril

जावा के बारे में

java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशान पुराने डेट-टाइम कक्षाओं जैसे java.util.Date , .Calendar , और java.text.SimpleDateFormat

Joda-Time प्रोजेक्ट, अब रखरखाव मोड में , जावा.टाइम में माइग्रेशन की सलाह देता है।

अधिक जानने के लिए, ओरेकल ट्यूटोरियल देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें।

जावाटाइम की अधिकांश कार्यक्षमता को ThreeTen-Backport में जावा 6 और 7 में बैक-पोर्ट किया गया Android और ThreeTenABP Android में ThreeTenABP में अनुकूलित किया गया Android (देखें कि कैसे उपयोग करें ... )।

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


बचाव के लिए Javadoc :

पदावनत। जेडीके संस्करण 1.1 के अनुसार, कैलेंडर.get (कैलेंडर.वायईएआर) - 1 9 00 द्वारा प्रतिस्थापित किया गया।

उस समय से 1 9 00 घटाने का नतीजा है जो उस समय ऑब्जेक्ट द्वारा दर्शाए गए समय के साथ तत्काल समय से शुरू होता है या स्थानीय समय क्षेत्र में व्याख्या किया जाता है।

आपको बहिष्कृत विधियों का उपयोग नहीं करना चाहिए। बहिष्कृत विधियां ऐसी विधियां हैं जिनका उपयोग अब नहीं किया जाना चाहिए। लेकिन जो कुछ भी आप उपयोग कर रहे हैं, उसे जानने के लिए अपने जावाडोक को पढ़ें।


राष्ट्रपति एविल ने इसे Date.getYear() , Date.getYear() एक ऐसा मूल्य देता है जो वर्ष से 1 9 00 घटाने का परिणाम है। और आपको इसका इस्तेमाल नहीं करना चाहिए।

लेकिन सवाल में कोड के लिए त्वरित फिक्स है:

Date dateFrom = null;

String gDFString = g.getDateFrom();

System.out.println(gDFString);

DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

try {
    dateFrom = df.parse("04/12/2011");

    System.out.println(dateFrom);

    // Add 1900 to dateFrom.getYear() 

    System.out.println(dateFrom.getYear()+1900);
} catch (ParseException e) {
    e.printStackTrace();
}

उन तरीकों को बहिष्कृत कर दिया गया है । इसके बजाय, Calendar वर्ग का उपयोग करें।

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public final class DateParseDemo {
    public static void main(String[] args){
         final DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
         final Calendar c = Calendar.getInstance();
         try {
             c.setTime(df.parse("04/12/2011"));
             System.out.println("Year = " + c.get(Calendar.YEAR));
             System.out.println("Month = " + (c.get(Calendar.MONTH)));
             System.out.println("Day = " + c.get(Calendar.DAY_OF_MONTH));
         } 
         catch (ParseException e) {
             e.printStackTrace();
         }
    }
}

आउटपुट :

Year = 2011
Month = 3
Day = 12

और महीने के क्षेत्र के लिए, यह 0-आधारित है। इसका मतलब है कि जनवरी = 0 और दिसंबर = 11. जैसा कि javadoc ने कहा है,

माह को इंगित करने और सेट करने के लिए फ़ील्ड नंबर। यह कैलेंडर-विशिष्ट मान है। ग्रेगोरियन और जूलियन कैलेंडर में वर्ष का पहला महीना JANUARY जो 0 ; अंतिम वर्ष में महीनों की संख्या पर निर्भर करता है।


यह केवल एक अनुमान है, लेकिन 111 1 9 00 के बाद से वर्षों की संख्या हो सकती है। दस्तावेज़ीकरण पर एक नज़र डालें / इसे सत्यापित करने के लिए कुछ परीक्षण करें (मैं इस समय जांच नहीं कर सकता)





calendar