जावा: दिनांक से महीने के पूर्णांक प्राप्त करें


157

मुझे दिनांक ऑब्जेक्ट ( java.util.Date) से पूर्णांक के रूप में महीना कैसे मिलेगा ?


23
वास्तव में GetMonth () की तारीख को हमेशा के लिए पदावनत कर दिया जाता है;)
Mateusz Dymczyk

6
@ श्लोक: पदावनत। JDK संस्करण 1.1 के अनुसार, Calendar.get (Calendar.MONTH) द्वारा प्रतिस्थापित किया गया है।
एड्रशर

3
@Zenzen मैं ज्यादातर पदावनत वर्ग में पदावनत विधि का उपयोग करने में समस्या नहीं देखता।
सेराबे

1
@Muhd अगर आप तिथियों के साथ काम कर रहे हैं, तो अपने आप को मदद करें और जोडा या किसी अन्य पुस्तकालय का उपयोग करें ।
सेराबे

1
@ सेराबे: समस्या यह है कि बेहतर समाधान हैं (जो कम से कम पदावनत नहीं हैं)। और गेटमार्ट को अब 14 वर्षों के लिए पदावनत कर दिया गया है और इसे एक कारण के लिए पदावनत कर दिया गया है।
मेटुसज़ डाइमेस्क

जवाबों:


57

java.time (जावा 8)

आप जावा 8 में java.time पैकेज का भी उपयोग कर सकते हैं और अपने java.util.Dateऑब्जेक्ट को ऑब्जेक्ट में बदल सकते हैं java.time.LocalDateऔर फिर बस getMonthValue()विधि का उपयोग कर सकते हैं ।

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();

ध्यान दें कि महीने के मूल्य यहां 1 से 12 के बीच दिए गए हैं, cal.get(Calendar.MONTH)जो एड्रश के उत्तर में दिए गए हैं, जो 0 से 11 तक मान देता है।

लेकिन जैसा कि तुलसी बोर्के ने टिप्पणियों में कहा, पसंदीदा तरीका विधि के Monthसाथ एक एनम ऑब्जेक्ट प्राप्त करना LocalDate::getMonthहै।


1
अच्छा उत्तर। पाठक को ध्यान दें: आप उत्तर में दिखाए गए डिफ़ॉल्ट के लिए कॉल पर भरोसा करने के बजाय एक समय क्षेत्र निर्दिष्ट करना चाह सकते हैं। एक नया दिन (और महीना) पहले पेरिस में आता है, उदाहरण के लिए, मॉन्ट्रियल की तुलना में। यदि आप विशेष रूप से मॉन्ट्रियल के बारे में परवाह करते हैं, तो उपयोग करें ZoneId.of( "America/Montreal" )
तुलसी बॉर्क

1
मैं सिर्फ यह जोड़ना चाहता हूं कि java.time api oracle.com/technetwork/articles/java/…

वैसे, पाठक को एक और नोट: आप केवल एक पूर्णांक संख्या के बजाय एक Monthएनम ऑब्जेक्ट प्राप्त कर सकते हैं । विधि Month m = localDate.gotMonth();देखें LocalDate::getMonth। इस तरह की वस्तुओं का उपयोग करना आपके कोड को स्व-दस्तावेजीकरण बनाता है, प्रकार-सुरक्षा सुनिश्चित करता है, और मान्य मूल्यों की गारंटी देता है। Oracle द्वारा Enum ट्यूटोरियल देखें ।
बेसिल बोर्क

1
यदि आप उपयोग करते हैं date.toInstant()और आप एक java.sql.Date(के बच्चे java.util.Date) के साथ काम कर रहे हैं तो आपको ए UnsupportedOperationException। कोशिशnew java.sql.Date(src.getTime()).toLocalDate()
एडम

1
@ java.sql.Dateपुराने वर्ग में जोड़े गए नए रूपांतरण विधियों का उपयोग करके / से कन्वर्ट करने में बहुत आसान । java.sql.Date.valueOf( myLocalDate )और myJavaSqlDate.toLocalDate() इसके अलावा, JDBC ड्राइवर्स JDBC 4.2 या बाद के अपडेट के लिए अब किसी java.sqlप्रकार की आवश्यकता नहीं है , और सीधे तरीके और विधियों के java.timeमाध्यम से पता कर सकते हैं । ResultSet::getObjectPreparedStatement::setObject
तुलसी बॉर्क

287
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);

166
ध्यान दें कि Calendar.MONTHकोई स्पष्ट कारणों के लिए शून्य आधारित नहीं है, अर्थात जनवरी == 0। अब यह एपीआई में ठीक दस्तावेज है, लेकिन यह अभी भी पहली बार उपयोगकर्ताओं के लिए नरक के रूप में भ्रमित है। मुझे अभी तक ऐसा कोई भी नहीं मिला है जो मुझे बता सके कि वे इसके साथ क्यों गए - शायद एक नए SO प्रश्न के लिए समय खुद (हालांकि मुझे डर है कि इसके लिए कोई महान पृष्ठभूमि नहीं है: /)
Voo

5
@Voo Date.getMonth () विधि शून्य आधारित थी, जो संभवत: कैलेंडर का मुख्य कारण है। MONTH भी है।
मुहम्मद

1
@Mhdhd यकीन है कि यह प्रतिस्थापन के बाद था। लेकिन यह केवल इस सवाल को घूमता है कि Date.getMonth () शून्य आधारित क्यों था? Imo एक भयानक डिजाइन, खासकर जब से दिन एक पर शुरू होते हैं (वे कम से कम लगातार हो सकते हैं!)। मुझे लगता है कि यह कुछ विशेष रूप से अच्छी तरह से डिजाइन एपीआई (दोनों तारीख और कैलेंडर) के साथ शुरू करने के लिए कुछ ओवरसाइट था। लेकिन शायद वहाँ कुछ मिसाल है - यह सिर्फ मुझे अजीब लगता है और मेरे अनुभव में एक से अधिक शुरुआत करने वालों के लिए समस्याएँ पैदा हुई हैं।
वू

2
वास्तव में यह पहले से ही एसओ (और न केवल) पर यहां पूछा गया है। निचला रेखा tnat है यह बुरी तरह से डिज़ाइन किए गए API का परिणाम है। मेरा मतलब है कि आपने पूरी तिथि वर्ग का उल्लेख किया है। मजेदार तथ्य यह है कि न केवल जावा इस समस्या से ग्रस्त है - iirc जावास्क्रिप्ट की तारीख getMonth () भी 0 से शुरू होती है!
मेटुसज़ डाइमेस्क

1
@Voo getYear()भी, "बिना किसी स्पष्ट कारणों के", १ ९ ०० तक घटाया गया।
हेले

17

यदि आप Java 8 डेट एपीआई का उपयोग करते हैं , तो आप इसे सीधे एक लाइन में प्राप्त कर सकते हैं!

LocalDate today = LocalDate.now();
int month = today.getMonthValue();

7

Joda समय

वैकल्पिक रूप से, जोडा-टाइम DateTime क्लास के साथ।

//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))

... या ...

int month = dateTime.getMonthOfYear();

2
और भी सरल, बस DateTimeइसके महीने के लिए वस्तु पूछें । int month = dateTime.getMonthOfYear();
बेसिल बोर्क

अच्छा फोन तुलसी, मैंने कोड अपडेट कर दिया है। हालांकि, मुझे पसंद है .toString("MM")क्योंकि यह दिखाता है कि "एमएम" की तुलना में अधिक संभावनाएं हैं।
22ow पर ssoward

1
यह उत्तर समय क्षेत्र के महत्वपूर्ण मुद्दे की अनदेखी करता है। प्रश्न और सहोदर उत्तर पर मेरी टिप्पणियाँ देखें। मैं DateTimeZoneउस DateTime कंस्ट्रक्टर को एक ऑब्जेक्ट पास करने का सुझाव देता हूं DateTimeZone.forID( "America/Montreal" ):।
तुलसी बॉर्क

6

tl; डॉ

myUtilDate.toInstant()                          // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
          .atZone(                              // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object. 
              ZoneId.of( "America/Montreal" )   // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
          )                                     // Returns a `ZonedDateTime` object.
          .getMonthValue()                      // Extract a month number. Returns a `int` number.

java.time विवरण

उत्तर प्रयोग करने के लिए Ortomala Lokni द्वारा java.time सही है। और आपको java.time का उपयोग करना चाहिए क्योंकि यह पुराने java.util.Date/.Calendar वर्गों पर एक विशाल सुधार है। देखें ओरेकल ट्यूटोरियल java.time पर।

मैं कुछ कोड दिखाऊंगा कि java.time का उपयोग कैसे करें java.util.ate के संबंध के बिना, जब आप नए सिरे से कोड के साथ शुरुआत कर रहे हों।

संक्षेप में java.time का उपयोग करना ... InstantUTC में समय पर एक क्षण है। ए ZoneIdपाने के लिए एक समय क्षेत्र ( ) लागू करेंZonedDateTime

Monthवर्ग एक परिष्कृत है enum सामान्य रूप में एक महीने का प्रतिनिधित्व करने के। उस enum में स्थानीय नाम प्राप्त करने जैसे आसान तरीके हैं। और बाकी का आश्वासन दिया है कि java.time में महीने की संख्या java.util.Date/.Calendar में पाया गया शून्य-आधारित बकवास (0-11) नहीं, बल्कि एक 1-12 है।

वर्तमान तिथि-समय प्राप्त करने के लिए, समय क्षेत्र महत्वपूर्ण है। किसी भी समय दुनिया भर में तारीख समान नहीं है। इसलिए महीने के अंत / शुरुआत के पास अगर दुनिया भर में महीने समान नहीं हैं।

ZoneId zoneId = ZoneId.of( "America/Montreal" );  // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth(); 
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );

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

Java.time ढांचे जावा 8 और बाद में बनाया गया है। इन कक्षाओं परेशानी वर्ष प्रतिस्थापित विरासत जैसे तिथि-समय कक्षाएं java.util.Date, Calendar, और SimpleDateFormat

Joda समय परियोजना, अब में रखरखाव मोड , प्रवास करने की सलाह देता java.time कक्षाएं।

अधिक जानने के लिए, Oracle ट्यूटोरियल देखें । और कई उदाहरणों और स्पष्टीकरणों के लिए ढेर अतिप्रवाह खोजें। विशिष्टता JSR 310 है

आप अपने डेटाबेस से सीधे java.time वस्तुओं का आदान-प्रदान कर सकते हैं । JDBC 4.2 या उसके बाद के JDBC ड्राइवर का अनुपालन करें । तारों की कोई जरूरत नहीं, कक्षाओं की कोई जरूरत नहीं ।java.sql.*

Java.time कक्षाएं कहाँ से प्राप्त करें?

ThreeTen-अतिरिक्त परियोजना अतिरिक्त कक्षाओं के साथ java.time फैली हुई है। यह परियोजना java.time के लिए भविष्य के संभावित अतिरिक्त के लिए एक साबित जमीन है। आप यहाँ कुछ उपयोगी वर्गों जैसे मिल सकता है Interval, YearWeek, YearQuarter, और अधिक


4

यदि आप जोडा समय का उपयोग नहीं कर सकते हैं और आप अभी भी अंधेरी दुनिया में रहते हैं :) (जावा 5 या उससे कम) आप इसका आनंद ले सकते हैं:

नोट: सुनिश्चित करें कि आपकी तिथि पहले से ही प्रारूप द्वारा बनाई गई है: dd / MM / YYYY

/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
    return Integer.parseInt(dateFormat.format(date));
}

/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
    return Integer.parseInt(dateFormat.format(date));
}

तुम माँ हो! / Είσαι ά μάνα!
त्जेगेनोस

0
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1

लौटाया गया मान 0 से शुरू होता है, इसलिए आपको परिणाम में एक जोड़ना चाहिए।


6
आपके उत्तर के साथ 2 समस्याएं: एक यह है कि आप new Date()बिना समय बिताए वर्तमान समय के साथ तारीख कर सकते हैं System.currentTimeMillis। दूसरा यह है कि गेटमार्ट को हटा दिया गया है।
Muhd

@ मुहम्मद तो सबसे अच्छा उपाय क्या है?
twlkyao

@Muhd System.currentTimeMillis () मैंने यहां जोड़ा था कि यह इंगित करने के लिए कि यहां एक लंबा प्रकार है, और आप तिथि निर्दिष्ट कर सकते हैं।
twlkyao

4
दिनांक :: getMonth पहले ही जावा 1.1 ( cs.mun.ca/~michael/java/jdk1.1-beta2-docs/api/… ) में पदावनत कर दिया गया था
ओरटोमला लोकनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.