जावा में चालू वर्ष का पूर्णांक मान प्राप्त करें


300

मुझे पूर्णांक के रूप में जावा में वर्तमान वर्ष निर्धारित करने की आवश्यकता है। मैं बस उपयोग कर सकता था java.util.Date(), लेकिन यह पदावनत है।


3
नहीं है, java.util.Dateहै नहीं नहीं जावा 8. अपने तरीकों में से कुछ के रूप में है, तो बहिष्कृत पदावनत कर रहे हैं लेकिन नहीं पूरी क्लास। लेकिन आपको दोनों से बचना चाहिए java.util.Dateऔर java.util.Calendarचूंकि वे कुख्यात परेशान, भ्रमित और दोषपूर्ण हैं। इसके बजाय java.time (जावा 8 में) या जोडा-टाइम का उपयोग करें
बेसिल बोर्के

जवाबों:


636
int year = Calendar.getInstance().get(Calendar.YEAR);

सुनिश्चित नहीं है कि यह एक नया कैलेंडर स्थापित करने के मानदंडों के साथ मिलता है या नहीं? (ऐसा करने का विरोध क्यों?)


1
आपके उत्तर को देखने पर, कैलेंडर उपयोग करने के लिए एक अच्छी वस्तु होगी। मैं एक-लाइनर की तलाश में था और मुझे नहीं लगता था कि कैलेंडर मेरे लिए होगा। गलत साबित मैं हूँ! धन्यवाद!
karlgrz

क्या संगामिति के बारे में, क्या होगा यदि अन्य कोड / लाइब्रेरी कोड का टुकड़ा वर्तमान समय बदलता है? क्या इसे किसी तरह संशोधित करना उचित नहीं होगा: कैलेंडर c = Calendar.getInstance (); सिंक्रोनाइज़ (c) {c.setTimeInMillis (System.currentTimeMillis ()); वापसी c.get (Calendar.YEAR);}
jnr

1
यह एंड्रॉइड के विभिन्न संस्करणों में एक अलग मूल्य देता है। मैं v4.2.1 के साथ एंड्रॉइड v4.1.2 की तुलना कर रहा हूं।
टोब्स्को 42

2
@ycnix कोड के साथ कोई समसामयिक समस्या नहीं है, इसलिए इसे और अधिक संकलित करने की आवश्यकता नहीं है। Calendar.getInstance().get(Calendar.YEAR) बाहरी रूप से घड़ी को बदलने के संबंध में परमाणु है, और synchronized(c)स्थानीय चर के एक नए उदाहरण पर किसी भी तरह से यहां बहुत बेकार हो जाएगा।
ओपन स्कूल


139

जावा 8 के टाइम एपीआई (यह मानते हुए कि आप अपने सिस्टम के डिफ़ॉल्ट समय क्षेत्र में वर्ष प्राप्त करने के लिए खुश हैं) का उपयोग करकेYear::now , आप इस विधि का उपयोग कर सकते हैं :

int year = Year.now().getValue();

7
मेरा सुझाव है कि हमेशा जेवीएम के वर्तमान डिफ़ॉल्ट क्षेत्र पर निर्भर ZoneIdरहने के nowबजाय वैकल्पिक तर्क को पारित करें (जो कि रनटाइम के दौरान किसी भी क्षण बदल सकता है!)।
बासिल बॉर्क

जो इस बीटीडब्ल्यू को पसंद करता है: int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney

25

यह सबसे सरल (कैलेंडर का उपयोग करके, क्षमा करें) है:

 int year = Calendar.getInstance().get(Calendar.YEAR);

नई तिथि और समय एपीआई JSR , साथ ही साथ Joda Time भी है


यह एंड्रॉइड के विभिन्न संस्करणों में एक अलग मूल्य देता है। मैं v4.2.1 के साथ एंड्रॉइड v4.1.2 की तुलना कर रहा हूं।
टॉब्स्को 42

1
@ toobsco42 - 'android Calendar.year bug' के लिए googling आज़माएं
टूलकिट

अरे @toolkit, मैं बिना किसी भाग्य के कुछ शोध कर रहा हूं। मैं और अधिक विशिष्ट उत्तर की उम्मीद कर रहा था।
टॉब्स्को 42

मैंने 4.1.2 के साथ फोन से अपना सिम कार्ड निकाल दिया। इसलिए नेटवर्क फोन पर दिनांक और समय को अपडेट करने में सक्षम नहीं था। नतीजतन फोन 2012 में अटक गया था। लगता है कि यह 4.1.2 में बग नहीं है।
बोब्स्को 42

14

सबसे आसान तरीका कैलेंडर से वर्ष प्राप्त करना है।

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);

Calendar.YEAR वर्तमान वर्ष नहीं है।
टूलकिट

Calendar.YEAR इस प्रकार परिभाषित किया गया है ... सार्वजनिक अंतिम स्थिर int YEAR = 1;
cagcowboy

2
कैलेंडर पर API () API को उस स्थति से प्राप्त होता है जो स्थिरांक द्वारा निर्दिष्ट क्षेत्र में है। वर्ष कैलेंडर ऑब्जेक्ट में 1 के क्षेत्र में स्थित है! Calendar.getInstance () को वर्तमान दिनांक मिल रहा है। java.sun.com/j2se/1.4.2/docs/api/java/util/…
बॉब किंग

यह एंड्रॉइड के विभिन्न संस्करणों में एक अलग मूल्य देता है। मैं v4.2.1 के साथ एंड्रॉइड v4.1.2 की तुलना कर रहा हूं।
टॉब्स्को 42

मैंने 4.1.2 के साथ फोन से अपना सिम कार्ड निकाल दिया। इसलिए नेटवर्क फोन पर दिनांक और समय को अपडेट करने में सक्षम नहीं था। नतीजतन फोन 2012 में अटक गया था। लगता है कि यह 4.1.2 में बग नहीं है।
बोब्स्को 42

13

आप java.time.YearMonth(जावा 8 से) 2 विधियों का उपयोग कर सकते हैं :

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();

आपने गलत तरीके से लंबे समय से पहले पोस्ट किए गए एक और उत्तर की नकल की है । और आप एक महीने का उत्पादन करते हैं जो प्रश्न के लिए अप्रासंगिक है। और आप समय क्षेत्र के महत्वपूर्ण मुद्दे की उपेक्षा करते हैं। और आपका फॉर्मेट गड़बड़ है। मुझे यह देखकर खुशी हुई कि आप स्टैक ओवरफ्लो में भाग ले रहे हैं। लेकिन यह उत्तर पर्याप्त नहीं है। इसकी कमजोरियों को ठीक करने के लिए संपादित करें और इससे पहले कि अन्य उत्तरों द्वारा प्रदान किए गए परे अधिक मूल्य जोड़ें या डाउन-वोट एकत्र करने से पहले अपना उत्तर हटा दें। PS सुपर अवतार आइकन!
तुलसी बॉर्क

दोस्त बहुत - बहुत धन्यवाद। मैंने संपादित किया है। लिंक थोड़ा अलग है कि मेरा रास्ता
झावरोव कॉन्स्टेंटिन

10

यदि आप किसी तिथि वस्तु का वर्ष चाहते हैं, तो मैंने निम्नलिखित विधि का उपयोग किया:

public static int getYearFromDate(Date date) {
    int result = -1;
    if (date != null) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        result = cal.get(Calendar.YEAR);
    }
    return result;
}

परिणाम 1970 है!
ANdRO

10

tl; डॉ

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

समय क्षेत्र

Raffi Khatchadourian द्वारा उत्तर बुद्धिमानी से पता चलता है कि जावा 8 में नए java.time पैकेज का उपयोग कैसे किया जाता है । लेकिन यह उत्तर एक तिथि निर्धारित करने में समय क्षेत्र के महत्वपूर्ण मुद्दे को संबोधित करने में विफल रहता है।

int year = LocalDate.now ()। getYear ();

यह कोड JVM के वर्तमान डिफ़ॉल्ट समय क्षेत्र पर निर्भर करता है। डिफ़ॉल्ट ज़ोन का उपयोग यह निर्धारित करने में किया जाता है कि आज की तारीख क्या है। उदाहरण के लिए, याद रखें कि पेरिस में मध्यरात्रि के बाद के क्षण में मॉन्ट्रियल में तारीख अभी भी 'कल' है।

तो आपके परिणाम इस बात पर भिन्न हो सकते हैं कि यह किस मशीन पर चलता है, एक उपयोगकर्ता / व्यवस्थापक होस्ट ओएस समय क्षेत्र या किसी भी जावा कोड को किसी भी समय जेवीएम के वर्तमान डिफ़ॉल्ट को बदलकर बदल सकता है। समय क्षेत्र निर्दिष्ट करने के लिए बेहतर है।

वैसे, हमेशा उपयोग उचित समय क्षेत्र के नाम के रूप में IANA द्वारा परिभाषित । कभी भी 3-4 अक्षर कोड का उपयोग न करें जो न तो मानकीकृत हैं और न ही अद्वितीय हैं।

java.time

जावा 8 के जावा में उदाहरण।

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

Joda समय

ऊपर के रूप में कुछ विचार है, लेकिन का उपयोग कर जोडा-टाइम 2.7 पुस्तकालय ।

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

वर्ष बढ़ाना / घटाना

यदि आपका लक्ष्य एक बार में एक वर्ष कूदना है, तो वर्ष संख्या निकालने की कोई आवश्यकता नहीं है। Joda-Time और java.time दोनों में एक वर्ष में एक वर्ष जोड़ने / घटाने के तरीके हैं। और वे तरीके स्मार्ट हैं, डेलाइट सेविंग टाइम और अन्य विसंगतियों को संभालना।

उदाहरण Joda-Time 2.7 में।

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
आलसी लोगों के लिए सभी क्षेत्र आईडी (मुझे के रूप में): mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@ एफबीबी मैं समय क्षेत्र के नामों की आधिकारिक आईएएनए सूची के लिए विकिपीडिया पृष्ठ सुझाता हूं । खबरदार: ये क्षेत्र अक्सर आश्चर्यजनक रूप से बदलते हैं। यदि आप वास्तव में अद्यतित जानकारी चाहते हैं, तो tzdataडेटा फ़ाइल की एक नई प्रतिलिपि स्वयं डाउनलोड करें। आप फ़ाइल का उपयोग कर सकते हैं। और आप अपने जावा कार्यान्वयन में एक पुरानी tzdata को बदल सकते हैं। Oracle उनके JVM के लिए एक अपडेटर टूल प्रदान करता है ।
बेसिल बॉर्क

4

यदि आपका एप्लिकेशन दिनांक और कैलेंडर ऑब्जेक्ट का भारी उपयोग कर रहा है, तो आपको वास्तव में Joda Time का उपयोग करना चाहिए, क्योंकि java.util.Dateयह परिवर्तनशील है। java.util.Calendarजब उसके क्षेत्र अपडेट हो जाते हैं, तो प्रदर्शन समस्याएं होती हैं, और डेटाटाइम अंकगणित के लिए क्लंकी होता है।



3

जैसा कि कुछ लोगों ने ऊपर बताया:

यदि आप बाद में चर का उपयोग करना चाहते हैं, तो बेहतर उपयोग करें:

int year;

year = Calendar.getInstance().get(Calendar.YEAR);

यदि आपको बेहतर स्थिति के लिए वर्ष की आवश्यकता है तो आप बेहतर उपयोग करें:

Calendar.getInstance().get(Calendar.YEAR)

उदाहरण के लिए, इसे उस वर्ष में उपयोग करते हुए, जो वर्ष की जाँच करता है, वर्तमान वर्ष की तुलना में कम नहीं है -200 या वर्तमान वर्ष की तुलना में अधिक (जन्म के समय हो सकता है):

import java.util.Calendar;
import java.util.Scanner;

public static void main (String[] args){

    Scanner scannernumber = new Scanner(System.in);
    int year;

    /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/

    do{
        System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
        year = scannernumber.nextInt();
    }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR));
}

3

जावा 8 के लिए निम्नलिखित कोड का उपयोग करें:

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();

0

मेरे मामले में उपरोक्त में से कोई भी काम नहीं किया गया है। इसलिए बहुत सारे समाधानों की कोशिश करने के बाद मैंने एक के नीचे पाया और यह मेरे लिए काम कर गया

import java.util.Scanner;
import java.util.Date;

public class Practice
{   
    public static void main(String[] args)
    {
        Date d=new Date();  
        int year=d.getYear();
        int currentYear=year+1900;    

        System.out.println(currentYear);

    }

}

वह विधि पदावनत है। और उस भयानक वर्ग को जेएसआर 310 में परिभाषित java.time कक्षाओं द्वारा वर्षों पहले दबा दिया गया था । उत्तर में आधुनिक समाधान देखें ।
तुलसी बॉर्क

-1

जावा संस्करण में java.time लाइब्रेरी का उपयोग 8+ कर सकते हैं (सलाह दी जाती है) । आईएसओ 8601 दिनांक लिखने का मानक तरीका निर्धारित करता है: YYYY-MM-DDऔर java.time.Instantइसका उपयोग करता है, इसलिए (इसके लिए UTC):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

पुनश्च सिर्फ मामले में (और प्राप्त करने के लिए शॉर्ट में String, नहीं int) का उपयोग कर Calendarदिखता है बेहतर और क्षेत्र-बारे में पता किया जा सकता है।


आप समय क्षेत्र के महत्वपूर्ण मुद्दे की अनदेखी कर रहे हैं। अन्य उत्तर में सरल समाधान देखें ।
तुलसी बॉर्क

-2

एक कैलेंडर को तुरंत करने की आवश्यकता के बिना आप इंटगर गणित का उपयोग करके पूरी बात कर सकते हैं:

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

नए साल पर एक या दो घंटे के लिए बंद हो सकते हैं, लेकिन मुझे यह धारणा नहीं है कि यह एक मुद्दा है?


9
क्या आप सेब के लिए काम कर रहे हैं, शायद? macworld.com/article/2023580/…
स्टीफन पॉल Noack

वाह, यह बहुत भारी है, मैं इसे सरल बनाए रखने का सुझाव दूंगा जैसे कि कैगबैंकबॉय ने दिखाया है।
LStrike

यह सभी परिस्थितियों में सर्वश्रेष्ठ नहीं हो सकता है, लेकिन यह पतन के लायक नहीं है।

-4

मैं अपनी लाइब्रेरी में दिनों / महीने / वर्ष की इन्टस के साथ काम करने के लिए विशेष कार्यों का उपयोग करता हूं -

int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
  Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
  return new int[] { 
    cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
  };
};


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