एक स्ट्रिंग के रूप में महीने का नाम


89

मैं एक स्ट्रिंग के रूप में महीने का नाम वापस करने की कोशिश कर रहा हूं, उदाहरण के लिए "मई", "सितंबर", "नवंबर"।

मैंने कोशिश की:

int month = c.get(Calendar.MONTH);

हालाँकि, यह पूर्णांक (5, 9, 11, क्रमशः) देता है। मुझे महीने का नाम कैसे मिल सकता है?

जवाबों:


88

GetDisplayName का उपयोग करें ।

पहले एपीआई के उपयोग के लिए String.format(Locale.US,"%tB",c);


मुझे एक समस्या मिली: getDisplayName (महीना, Calendar.LONG, Locale.US) और ग्रहण मुझे Calendar.Long या Calendar.SHORT बता रहा है, मौजूद नहीं हैं।
गैबी

यह बहुत अजीब है। आप का उपयोग कर रहे हैं java.util.Calendarऔर नहीं कुछ अन्य Calendarवर्ग, सही?
सत्यता

हाँ। यह getDisplayName () और संबद्ध कैलेंडर की तरह दिखता है। कैलेंडर और कैलेंडर। SHORT केवल API स्तर 9 हैं। तो, यह स्तर 9 के लिए काम करता है, लेकिन मुझे स्तर 7 :(
गेब

3
Formatter f = new Formatter();(वैकल्पिक रूप से आप इसे एक स्थान दे सकते हैं) तब String monthName = f.format("%tB",c).toString();या %tbसंक्षिप्त नाम के लिए।
सत्यता

5
इसके बजाय Locale.getDefault () Locale.US के बजाय का उपयोग करना एक अच्छा विचार हो सकता है :)
शाइन

159

इसे इस्तेमाल करो :

Calendar cal=Calendar.getInstance();
SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
String month_name = month_date.format(cal.getTime());

महीने के नाम में पूरे महीने का नाम होगा, अगर आप चाहते हैं कि छोटे महीने के नाम का उपयोग किया जाए

 SimpleDateFormat month_date = new SimpleDateFormat("MMM");
 String month_name = month_date.format(cal.getTime());

13
"MMMM" पहले मामले के लिए पर्याप्त होगा।
यानचेन

116

स्ट्रिंग चर में महीने प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें

उदाहरण के लिए सितंबर का महीना:

एम -> 9

एमएम -> 09

MMM -> सिपाही

MMMM -> सितंबर

String monthname=(String)android.text.format.DateFormat.format("MMMM", new Date())

1
हां, धन्यवाद, यह एक आकर्षण की तरह काम करता है, सभी भाषाओं में मैं (फ्रेंच, अंग्रेजी, जर्मन) का उपयोग करता हूं
क्राइसोट्रिबैक्स

45

"MMMM" निश्चित रूप से सही समाधान नहीं है (भले ही यह कई भाषाओं के लिए काम करता हो), "LLLL" पैटर्न का उपयोग करें SimpleDateFormat

स्टैंड-अलोन महीने के नामों के लिए आईसीयू-संगत एक्सटेंशन के रूप में 'एल' के समर्थन को जून 2010 पर एंड्रॉइड प्लेटफॉर्म में जोड़ा गया था ।

यहां तक ​​कि अगर अंग्रेजी में 'MMMM' और 'LLLL' द्वारा एन्कोडिंग के बीच कोई अंतर नहीं है, तो भी आपको अन्य भाषाओं के बारे में सोचना चाहिए।

उदाहरण के लिए, यह वही है जो आपको मिलता है, यदि आप Calendar.getDisplayNameरूसी के साथ जनवरी के लिए "MMMM" पैटर्न का उपयोग करते हैं Locale:

января (जो पूर्ण तिथि स्ट्रिंग के लिए सही है: " 10 января, 2014 ")

लेकिन एक स्टैंड-अलोन महीने के नाम के मामले में आप उम्मीद करेंगे:

январь

सही समाधान है:

 SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
 dateFormat.format( date );

यदि आप रुचि रखते हैं कि सभी अनुवाद कहाँ से आते हैं - तो यहाँ ग्रैगोरियन कैलेंडर अनुवाद (पृष्ठ के शीर्ष पर जुड़े अन्य कैलेंडर) का संदर्भ दिया गया है


1
'LLLL' केवल Java 8 के बाद से उपलब्ध है, आप SimpleDateFormat के साथ 'MMMM' का उपयोग कर सकते हैं और यह स्टैंडअलोन संस्करण के लिए भी पूरी तरह से ठीक है।
जुआनहाइन्स

स्पष्ट होने के लिए, रूसी में "арнваря" का अनुवाद जननशील मामला है, जिसका अर्थ "जनवरी" है जबकि "арнварь" नाममात्र है, जिसका अर्थ है "जनवरी"। यूक्रेनी और सर्बियाई जैसे इस भेद के साथ अन्य स्लाव भाषाएं हो सकती हैं। यह सिर्फ व्याकरणिक है और आमतौर पर बहुत महत्वपूर्ण नहीं है। लेकिन इस उत्तर में दिए गए उपयोग के मामले व्याकरणिक रूप से सही हैं: यदि आप जितना संभव हो उतना सही होना चाहते हैं, तो महीने और प्रदर्शन को पूरी तरह से दिखाने के लिए MMMM का उपयोग करें।
चांदनीशेख

23

यह जितना सरल है

mCalendar = Calendar.getInstance();    
String month = mCalendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault());

Calendar.LONG महीने का पूरा नाम पाने के लिए है और Calendar.SHORT संक्षेप में नाम देता है। उदाहरण के लिए: Calendar.LONG जनवरी कैलेंडर वापस आ जाएगी


बहुत बढ़िया जवाब। मैं अलार्म के लिए खुद से कैलेंडर सेट कर रहा था और बाद में महीने का नाम लेने की जरूरत थी। बिल्कुल सही जवाब। आपका
धन्यवाद

10

मैं इस जवाब को रखता हूं जो अन्य मामलों के लिए उपयोगी है, लेकिन @ ट्रूथलिटी उत्तर सबसे सरल और सीधा तरीका लगता है।

आप DateFormatSymbols का उपयोग कर सकते हैं

DateFormatSymbols(Locale.FRENCH).getMonths()[month]; // FRENCH as an example

5

एंड्रॉइड पर एकमात्र तरीका ठीक से स्वरूपित स्टेनालोन महीने का नाम ऐसी भाषाओं के लिए है, जैसे कि कॉरट, रूसी, चेक

private String getMonthName(Calendar calendar, boolean short) {
    int flags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_NO_MONTH_DAY | DateUtils.FORMAT_NO_YEAR;
    if (short) {
        flags |= DateUtils.FORMAT_ABBREV_MONTH;
    }
    return DateUtils.formatDateTime(getContext(), calendar.getTimeInMillis(), flags);
}

एपीआई 15-25 पर परीक्षण किया गया

के लिए आउटपुट मई है Май नहीं बल्कि Мая


3

रूस।

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    new Locale( "ru" , "RU" )
)

май

संयुक्त राज्य अमेरिका में अंग्रेजी।

Month
.MAY
.getDisplayName(
    TextStyle.FULL_STANDALONE ,
    Locale.US
)

मई

इस कोड को IdeOne.com पर लाइव देखें

थ्रीटेनबप और जावा.टाइम

यहाँ आधुनिक उत्तर है। जब यह सवाल 2011 में पूछा गया था, CalendarऔरGregorianCalendar आमतौर पर दिनांक और समय के लिए उपयोग किया जाता था, भले ही वे हमेशा खराब तरीके से डिजाइन किए गए थे। अब से 8 साल पहले की बात है, और वे कक्षाएं बहुत पुरानी हैं। यह मानते हुए कि आप अभी तक एपीआई स्तर 26 पर नहीं हैं, मेरा सुझाव थ्री टीएनएएनबीपी पुस्तकालय का उपयोग करना है, जिसमें जावा का एक एंड्रॉइड अनुकूलित बैकपोर्ट है। आधुनिक जावा तिथि और समय एपीआई। java.time के साथ काम करने के लिए बहुत अच्छा है।

आपकी सटीक आवश्यकताओं और स्थिति के आधार पर दो विकल्प हैं:

  1. उपयोग Monthऔर इसकी getDisplayNameविधि।
  2. एक का उपयोग करें DateTimeFormatter

महीने का उपयोग करें

    Locale desiredLanguage = Locale.ENGLISH;
    Month m = Month.MAY;
    String monthName = m.getDisplayName(TextStyle.FULL, desiredLanguage);
    System.out.println(monthName);

इस स्निपेट से आउटपुट है:

मई

कुछ भाषाओं में यह फर्क पड़ेगा कि आप उपयोग करते हैं TextStyle.FULLया नहीं TextStyle.FULL_STANDALONE। आपको यह देखना होगा, हो सकता है कि आप अपने उपयोगकर्ताओं के साथ जांच करें कि दोनों में से कौन सा आपके संदर्भ में फिट बैठता है।

DateTimeFormatter का उपयोग करें

यदि आपको दिन के समय के साथ या बिना तारीख मिली है, तो मुझे DateTimeFormatterअधिक व्यावहारिक लगता है । उदाहरण के लिए:

    DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("MMMM", desiredLanguage);

    ZonedDateTime dateTime = ZonedDateTime.of(2019, 5, 31, 23, 49, 51, 0, ZoneId.of("America/Araguaina"));
    String monthName = dateTime.format(monthFormatter);

मैं ZonedDateTimeपुराने Calendarवर्ग के लिए निकटतम प्रतिस्थापन का उपयोग कर रहा हूं । इसके बाद के संस्करण कोड एक के लिए काम करेंगे LocalDateएक, LocalDateTime, MonthDay, OffsetDateTimeऔर एक YearMonthभी।

क्या होगा यदि आपको Calendarएक विरासत एपीआई से मिला जो अभी तक java.time में अपग्रेड नहीं हुआ है? A में कनवर्ट करें ZonedDateTimeऔर ऊपर के रूप में आगे बढ़ें:

    Calendar c = getCalendarFromLegacyApi();
    ZonedDateTime dateTime = DateTimeUtils.toZonedDateTime(c);

बाकी सब पहले जैसा ही है।

प्रश्न: java.time को Android API स्तर 26 की आवश्यकता नहीं है?

java.time पुराने और नए दोनों Android उपकरणों पर अच्छी तरह से काम करता है। इसके लिए बस कम से कम जावा 6 की आवश्यकता होती है ।

  • जावा 8 और बाद में और नए एंड्रॉइड डिवाइसों पर (एपीआई स्तर 26 से) आधुनिक एपीआई बिल्ट-इन आता है।
  • गैर-एंड्रॉइड जावा 6 और 7 में थ्रीटैन बैकपोर्ट मिलता है, आधुनिक कक्षाओं का बैकपोर्ट (जेएसआर 310 में थ्रीटेन, नीचे लिंक देखें)।
  • पर (पुराने) एंड्रॉइड, थ्रीटेन बैकपोर्ट के एंड्रॉइड संस्करण का उपयोग करते हैं। इसे थ्रीटेनबप कहा जाता है। और सुनिश्चित करें कि आप org.threeten.bpसबपेकेज से दिनांक और समय की कक्षाओं का आयात करते हैं ।

लिंक


2

मैं Calendarऑब्जेक्ट का उपयोग करने की सलाह दूंगा और Localeचूंकि विभिन्न भाषाओं के लिए महीने के नाम अलग-अलग हैं:

// index can be 0 - 11
private String getMonthName(final int index, final Locale locale, final boolean shortName)
{
    String format = "%tB";

    if (shortName)
        format = "%tb";

    Calendar calendar = Calendar.getInstance(locale);
    calendar.set(Calendar.MONTH, index);
    calendar.set(Calendar.DAY_OF_MONTH, 1);

    return String.format(locale, format, calendar);
}

पूरे महीने के नाम के लिए उदाहरण:

System.out.println(getMonthName(0, Locale.US, false));

परिणाम: January

छोटे महीने के नाम के लिए उदाहरण:

System.out.println(getMonthName(0, Locale.US, true));

परिणाम: Jan


2

इस प्रारूप में दिनांक और समय प्राप्त करने का एक नमूना तरीका "2018 नवंबर 01 16:18:22" का उपयोग करें

DateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd HH:mm:ss");
        Date date = new Date();
         dateFormat.format(date);

0

जावा में "सही" प्रदर्शन करने के लिए एक स्टैंडअलोन महीने का नाम प्राप्त करना आश्चर्यजनक रूप से मुश्किल है। (कम से कम इस लेखन के रूप में। मैं वर्तमान में जावा 8 का उपयोग कर रहा हूं)।

समस्या यह है कि रूसी और चेक सहित कुछ भाषाओं में, महीने के नाम का स्टैंडअलोन संस्करण "स्वरूपण" संस्करण से अलग है। इसके अलावा, ऐसा प्रतीत होता है कि कोई भी जावा एपीआई आपको केवल "सर्वश्रेष्ठ" स्ट्रिंग नहीं देगा। अब तक यहां पोस्ट किए गए अधिकांश उत्तर केवल प्रारूपण संस्करण प्रदान करते हैं। नीचे दिया गया एक महीने के नाम के स्टैंडअलोन संस्करण को प्राप्त करने या उन सभी के साथ एक सरणी प्राप्त करने के लिए नीचे दिया गया कार्य समाधान है।

मुझे आशा है कि यह किसी और को कुछ समय बचाता है!

/**
 * getStandaloneMonthName, This returns a standalone month name for the specified month, in the
 * specified locale. In some languages, including Russian and Czech, the standalone version of
 * the month name is different from the version of the month name you would use as part of a
 * full date. (Different from the formatting version).
 *
 * This tries to get the standalone version first. If no mapping is found for a standalone
 * version (Presumably because the supplied language has no standalone version), then this will
 * return the formatting version of the month name.
 */
private static String getStandaloneMonthName(Month month, Locale locale, boolean capitalize) {
    // Attempt to get the standalone version of the month name.
    String monthName = month.getDisplayName(TextStyle.FULL_STANDALONE, locale);
    String monthNumber = "" + month.getValue();
    // If no mapping was found, then get the formatting version of the month name.
    if (monthName.equals(monthNumber)) {
        DateFormatSymbols dateSymbols = DateFormatSymbols.getInstance(locale);
        monthName = dateSymbols.getMonths()[month.getValue()];
    }
    // If needed, capitalize the month name.
    if ((capitalize) && (monthName != null) && (monthName.length() > 0)) {
        monthName = monthName.substring(0, 1).toUpperCase(locale) + monthName.substring(1);
    }
    return monthName;
}

/**
 * getStandaloneMonthNames, This returns an array with the standalone version of the full month
 * names.
 */
private static String[] getStandaloneMonthNames(Locale locale, boolean capitalize) {
    Month[] monthEnums = Month.values();
    ArrayList<String> monthNamesArrayList = new ArrayList<>();
    for (Month monthEnum : monthEnums) {
        monthNamesArrayList.add(getStandaloneMonthName(monthEnum, locale, capitalize));
    }
    // Convert the arraylist to a string array, and return the array.
    String[] monthNames = monthNamesArrayList.toArray(new String[]{});
    return monthNames;
}

0

स्ट्रिंग में महीने का नाम प्राप्त करें।

 private String getMonthName() {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat month_date = new SimpleDateFormat("MMMM");
    String month_name = month_date.format(cal.getTime());
    return month_name;
}

उपयोग:

String monthName = getMonthName();

लंबे आउटमोडेड और कुख्यात परेशान करने वाले SimpleDateFormatवर्ग और दोस्तों का उपयोग न करने पर विचार करें। देखें कि क्या आप java.time, आधुनिक जावा दिनांक और समय एपीआई का उपयोग करने के लिए या तो अपने एंड्रॉइड प्रोजेक्ट में थ्री टीएनएएनबीपी का उपयोग कर सकते हैं या जोड़ सकते हैं । इसके साथ काम करने के लिए बहुत अच्छा है।
ओले वीवी

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