2009-06-24 19 views
80

मैं एक पूर्णांक हो और मैं विभिन्न स्थानों में एक महीने के नाम को बदलने के लिए की जरूरत है: स्थान के लिएमैं एक इंटीजर को जावा में स्थानीयकृत महीने के नाम में कैसे परिवर्तित कर सकता हूं?

उदाहरण en-us:
1 -> जनवरी
2 -> फ़रवरी

स्थान तों के लिए उदाहरण -mx:
1 -> Enero
2 -> Febrero

+3

से सावधान रहें, जावा महीने शून्य आधारित इतना 0 = जनवरी, 1 = फ़रवरी, आदि कर रहे हैं –

+0

तुम ठीक कह रहे हैं, इसलिए यदि भाषा बदलने के लिए एक की जरूरत है, बस स्थान बदलने की जरूरत है। धन्यवाद – atomsfat

+0

@ निकहोल्ट ** अद्यतन ** आधुनिक ['जावा.टाइमथथ]] (https://docs.oracle.com/javase/9/docs/api/java/time/Month.html) enum एक-आधारित है जनवरी-दिसंबर के लिए 1-12। [Java.time.DayOfWeek] के लिए Ditto (https://docs.oracle.com/javase/9/docs/api/java/time/DayOfWeek.html): 1-7 सोमवार-रविवार प्रति आईएसओ 8601 मानक के लिए 1-7। केवल 'परेशानी' जैसी पुरानी विरासत डेट-टाइम कक्षाओं में पागल नंबरिंग योजनाएं हैं। लीगेसी कक्षाओं से बचने के कई कारणों में से एक, अब पूरी तरह से * java.time * कक्षाओं द्वारा आपूर्ति की जाती है। –

उत्तर

172
import java.text.DateFormatSymbols; 
public String getMonth(int month) { 
    return new DateFormatSymbols().getMonths()[month-1]; 
} 
+10

क्या आपको 'महीना -1' की आवश्यकता नहीं है, क्योंकि सरणी शून्य आधारित है? atomsfat चाहता है 1 -> जनवरी आदि –

+4

वह महीने-1 की जरूरत है, क्योंकि महीने के 1 के आधार पर महीने के नंबर जो शून्य आधारित सरणी स्थिति –

+0

यह भी काम करता है के लिए परिवर्तित किए जाने की आवश्यकता है, तो आप के साथ DateFormatSymbols का निर्माण करने की जरूरत है हालांकि लोकेल। – stevedbrown

14

मैं SimpleDateFormat का प्रयोग करेंगे। अगर कोई मोंटेड कैलेंडर बनाने का कोई आसान तरीका है, तो कोई मुझे सही करता है, हालांकि मैं इसे कोड में करता हूं और मुझे इतना यकीन नहीं है।

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


public String formatMonth(int month, Locale locale) { 
    DateFormat formatter = new SimpleDateFormat("MMMM", locale); 
    GregorianCalendar calendar = new GregorianCalendar(); 
    calendar.set(Calendar.DAY_OF_MONTH, 1); 
    calendar.set(Calendar.MONTH, month-1); 
    return formatter.format(calendar.getTime()); 
} 
+1

"एमएमएमएम" पर्याप्त है। –

13

यहां मैं यह कैसे करूँगा। मैं आपको int month पर रेंज जांच छोड़ दूंगा।

import java.text.DateFormatSymbols; 

public String formatMonth(int month, Locale locale) { 
    DateFormatSymbols symbols = new DateFormatSymbols(locale); 
    String[] monthNames = symbols.getMonths(); 
    return monthNames[month - 1]; 
} 
9

SimpleDateFormat का उपयोग करना।

import java.text.SimpleDateFormat; 

public String formatMonth(String month) { 
    SimpleDateFormat monthParse = new SimpleDateFormat("MM"); 
    SimpleDateFormat monthDisplay = new SimpleDateFormat("MMMM"); 
    return monthDisplay.format(monthParse.parse(month)); 
} 


formatMonth("2"); 

परिणाम: फरवरी

5

जाहिर है Android 2.2 में वहाँ SimpleDateFormat साथ एक बग है।

आदेश माह नामों का उपयोग करने से आप अपने संसाधनों में उन्हें अपने निर्धारित करने की में:

<string-array name="month_names"> 
    <item>January</item> 
    <item>February</item> 
    <item>March</item> 
    <item>April</item> 
    <item>May</item> 
    <item>June</item> 
    <item>July</item> 
    <item>August</item> 
    <item>September</item> 
    <item>October</item> 
    <item>November</item> 
    <item>December</item> 
</string-array> 

और फिर इस तरह अपने कोड में उन्हें इस्तेमाल:

/** 
* Get the month name of a Date. e.g. January for the Date 2011-01-01 
* 
* @param date 
* @return e.g. "January" 
*/ 
public static String getMonthName(Context context, Date date) { 

    /* 
    * Android 2.2 has a bug in SimpleDateFormat. Can't use "MMMM" for 
    * getting the Month name for the given Locale. Thus relying on own 
    * values from string resources 
    */ 

    String result = ""; 

    Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 
    int month = cal.get(Calendar.MONTH); 

    try { 
     result = context.getResources().getStringArray(R.array.month_names)[month]; 
    } catch (ArrayIndexOutOfBoundsException e) { 
     result = Integer.toString(month); 
    } 

    return result; 
} 
+0

_ "जाहिर है एंड्रॉइड 2.2 में एक बग है" _ - यह उपयोगी होगा अगर आप उस बग को ट्रैक कर सकते हैं जहां बग ट्रैक किया गया है। –

26

आप के लिए llll उपयोग करने की आवश्यकता अकेले महीने के नाम। इस तरह के रूप में, SimpleDateFormat दस्तावेज में दर्ज है:

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

बड़ा धन्यवाद, दोस्त। – antongorodezkiy

+0

जेडीके 1.7/'अवैध आरेखण अपवाद: अवैध पैटर्न चरित्र 'एल' – AntJavaDev

7

java.time

जावा 1.8 (या ThreeTen-Backport साथ 1.7 & 1.6) आप उपयोग कर सकते हैं के बाद से इस:

Month.of(integerMonth).getDisplayName(TextStyle.FULL_STANDALONE, locale); 

नोट कि integerMonth 1-आधारित है, यानी 1 जनवरी के लिए है। जनवरी-दिसंबर के लिए सीमा हमेशा 1 से 12 तक होती है (यानी केवल ग्रेगोरियन कैलेंडर)।

+0

मान लीजिए कि आपके द्वारा पोस्ट की गई विधि (फ्रेंच में माई माई) का उपयोग करके फ्रेंच में मई का स्ट्रिंग माह मई हो सकता है, मैं इस स्ट्रिंग से नंबर 5 कैसे प्राप्त कर सकता हूं? ? – usertest

+0

@usertest मैंने पास किए गए स्थानीयकृत महीने नाम स्ट्रिंग से 'माह' ऑब्जेक्ट प्राप्त करने के लिए [मेरे उत्तर] (https://stackoverflow.com/a/39220766/642706) में एक मोटा-ड्राफ्ट क्लास 'MonthDelocalizer' लिखा है: 'माई '→ महीना। मई। ध्यान दें कि केस-संवेदनशीलता मायने रखती है: फ्रेंच में, 'माई' अमान्य है और 'माई' होना चाहिए। –

1

एक समस्या है जो जब आप नाम से महीना पाने के लिए अपने getMonthName विधि के लिए DateFormatSymbols क्लास का उपयोग यह कुछ Android उपकरणों में संख्या से महीना दिखाने है।

String_array में: मैं इस तरह से कार्य करके इस समस्या का समाधान है।कोडिंग :)

0
public static void main(String[] args) { 
    SimpleDateFormat format = new SimpleDateFormat("MMMMM", new Locale("en", "US")); 
    System.out.println(format.format(new Date())); 
} 
+0

यह उचित उत्तर होना प्रतीत होता है, लेकिन क्या आप यह समझा सकते हैं कि आप क्या करते हैं और आप इसे इस तरह क्यों करते हैं? –

+0

मैं इस तरह से करता हूं क्योंकि मुझे लगता है कि सरल और जटिल नहीं है! –

2

tl

public String[] getYearMonthName() { 
     return getResources().getStringArray(R.array.year_month_names); 
     //or like 
     //return cntx.getResources().getStringArray(R.array.month_names); 
    } 

     String[] months = getYearMonthName(); 
      if (i < months.length) { 
      monthShow.setMonthName(months[i] + " " + year); 

      } 

मुबारक, डॉ

Month.of(yourMonthNumber) 
    .getDisplayName( 
     TextStyle.SHORT_STANDALONE , 
     new Locale("es" , "MX") 
) 

java.time.Month

: एक्सएमएल

<string-array name="year_month_name"> 
    <item>January</item> 
    <item>February</item> 
    <item>March</item> 
    <item>April</item> 
    <item>May</item> 
    <item>June</item> 
    <item>July</item> 
    <item>August</item> 
    <item>September</item> 
    <item>October</item> 
    <item>November</item> 
    <item>December</item> 
    </string-array> 

जावा वर्ग में सिर्फ इस तरह की तरह इस सरणी फोन

जावा.टाइम कक्षाओं में अब करना बहुत आसान है जो इन परेशानी पुरानी विरासत दिनांक-समय कक्षाओं को प्रदान करते हैं।

Month enum एक दर्जन वस्तुओं को परिभाषित करता है, प्रत्येक महीने के लिए एक।

महीनों जनवरी-दिसंबर के लिए 1-12 अंकों की संख्या है।

Month month = Month.of(2); // 2 → February. 

ऑब्जेक्ट को name of the month, automatically localized की स्ट्रिंग उत्पन्न करने के लिए कहें।

TextStyle समायोजित करने के लिए यह निर्दिष्ट करने के लिए कि आप कितना लंबा या संक्षिप्त नाम चाहते हैं। ध्यान दें कि कुछ भाषाओं में (अंग्रेज़ी नहीं) महीने का नाम अलग-अलग होता है या पूरी तारीख के हिस्से के रूप में भिन्न होता है। तो प्रत्येक पाठ शैली में …_STANDALONE संस्करण होता है।

एक Locale निर्धारित करने के लिए निर्दिष्ट करें:

  • मानव भाषा अनुवाद में इस्तेमाल किया जाना चाहिए कौन सा।
  • कौन सा सांस्कृतिक मानदंड संक्षेप, विराम चिह्न और पूंजीकरण जैसे मुद्दों का निर्णय लेना चाहिए।

उदाहरण:

Locale l = new Locale("es" , "MX"); 
String output = Month.FEBRUARY.getDisplayName(TextStyle.SHORT_STANDALONE , l); // Or Locale.US, Locale.CANADA_FRENCH. 

नाम → Month वस्तु

FYI करें, दूसरी दिशा (एक नाम के- महीने स्ट्रिंग को पार्स एक Month enum वस्तु प्राप्त करने के लिए) नहीं जा रहा है में निर्मित। ऐसा करने के लिए आप अपनी कक्षा लिख ​​सकते हैं। यहां इस तरह के एक वर्ग में मेरा त्वरित प्रयास है। अपने जोखिम पर प्रयोग करें। मैंने इस कोड को कोई गंभीर विचार नहीं दिया और न ही कोई गंभीर परीक्षण किया।

उपयोग।

Month m = MonthDelocalizer.of(Locale.CANADA_FRENCH).parse("janvier") ; // Month.JANUARY 

कोड।

package com.basilbourque.example; 

import org.jetbrains.annotations.NotNull; 
import org.jetbrains.annotations.Nullable; 

import java.time.Month; 
import java.time.format.TextStyle; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Locale; 

// For a given name of month in some language, determine the matching `java.time.Month` enum object. 
// This class is the opposite of `Month.getDisplayName` which generates a localized string for a given `Month` object. 
// Usage… MonthDelocalizer.of(Locale.CANADA_FRENCH).parse("janvier") → Month.JANUARY 
// Assumes `FormatStyle.FULL`, for names without abbreviation. 
// About `java.time.Month` enum: https://docs.oracle.com/javase/9/docs/api/java/time/Month.html 
// USE AT YOUR OWN RISK. Provided without guarantee or warranty. No serious testing or code review was performed. 
public class MonthDelocalizer 
{ 
    @NotNull 
    private Locale locale; 

    @NotNull 
    private List <String> monthNames, monthNamesStandalone; // Some languages use an alternate spelling for a “standalone” month name used without the context of a date. 

    // Constructor. Private, for static factory method. 
    private MonthDelocalizer (@NotNull Locale locale) 
    { 
     this.locale = locale; 

     // Populate the pair of arrays, each having the translated month names. 
     int countMonthsInYear = 12; // Twelve months in the year. 
     this.monthNames = new ArrayList <>(countMonthsInYear); 
     this.monthNamesStandalone = new ArrayList <>(countMonthsInYear); 

     for (int i = 1 ; i <= countMonthsInYear ; i++) 
     { 
      this.monthNames.add(Month.of(i).getDisplayName(TextStyle.FULL , this.locale)); 
      this.monthNamesStandalone.add(Month.of(i).getDisplayName(TextStyle.FULL_STANDALONE , this.locale)); 
     } 
//  System.out.println(this.monthNames); 
//  System.out.println(this.monthNamesStandalone); 
    } 

    // Constructor. Private, for static factory method. 
    // Personally, I think it unwise to default implicitly to a `Locale`. But I included this in case you disagree with me, and to follow the lead of the *java.time* classes. --Basil Bourque 
    private MonthDelocalizer () 
    { 
     this(Locale.getDefault()); 
    } 

    // static factory method, instead of constructors. 
    // See article by Dr. Joshua Bloch. http://www.informit.com/articles/article.aspx?p=1216151 
    // The `Locale` argument determines the human language and cultural norms used in de-localizing input strings. 
    synchronized static public MonthDelocalizer of (@NotNull Locale localeArg) 
    { 
     MonthDelocalizer x = new MonthDelocalizer(localeArg); // This class could be optimized by caching this object. 
     return x; 
    } 

    // Attempt to translate the name of a month to look-up a matching `Month` enum object. 
    // Returns NULL if the passed String value is not found to be a valid name of month for the human language and cultural norms of the `Locale` specified when constructing this parent object, `MonthDelocalizer`. 
    @Nullable 
    public Month parse (@NotNull String input) 
    { 
     int index = this.monthNames.indexOf(input); 
     if (- 1 == index) 
     { // If no hit in the contextual names, try the standalone names. 
      index = this.monthNamesStandalone.indexOf(input); 
     } 
     int ordinal = (index + 1); 
     Month m = (ordinal > 0) ? Month.of(ordinal) : null; // If we have a hit, determine the `Month` enum object. Else return null. 
     if (null == m) 
     { 
      throw new java.lang.IllegalArgumentException("The passed month name: ‘" + input + "’ is not valid for locale: " + this.locale.toString()); 
     } 
     return m; 
    } 

    // `Object` class overrides. 

    @Override 
    public boolean equals (Object o) 
    { 
     if (this == o) return true; 
     if (o == null || getClass() != o.getClass()) return false; 

     MonthDelocalizer that = (MonthDelocalizer) o; 

     return locale.equals(that.locale); 
    } 

    @Override 
    public int hashCode () 
    { 
     return locale.hashCode(); 
    } 

    public static void main (String[] args) 
    { 
     // Usage example: 
     MonthDelocalizer monthDelocJapan = MonthDelocalizer.of(Locale.JAPAN); 
     try 
     { 
      Month m = monthDelocJapan.parse("pink elephant"); // Invalid input. 
     } catch (IllegalArgumentException e) 
     { 
      // … handle error 
      System.out.println("ERROR: " + e.getLocalizedMessage()); 
     } 

     // Ignore exception. (not recommended) 
     if (MonthDelocalizer.of(Locale.CANADA_FRENCH).parse("janvier").equals(Month.JANUARY)) 
     { 
      System.out.println("GOOD - In locale "+Locale.CANADA_FRENCH+", the input ‘janvier’ parses to Month.JANUARY."); 
     } 
    } 
} 

बारे java.time

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

Joda-Time प्रोजेक्ट, अब maintenance mode में, java.time कक्षाओं में माइग्रेशन की सलाह देता है।

और जानने के लिए, Oracle Tutorial देखें। और कई उदाहरणों और स्पष्टीकरणों के लिए स्टैक ओवरफ़्लो खोजें। विशिष्टता JSR 310 है।

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

जावा.टाइम कक्षाएं कहां प्राप्त करें?

  • Java SE 8, Java SE 9, और बाद में
    • में निर्मित।
    • एक बंडल कार्यान्वयन के साथ मानक जावा एपीआई का हिस्सा।
    • जावा 9 कुछ मामूली विशेषताओं और सुधारों को जोड़ता है।
  • Java SE 6 और Java SE 7
    • java.time कार्यक्षमता की ज्यादातर ThreeTen-Backport में जावा 6 & से 7 वापस भेजा गया है।
  • Android
    • java.time वर्गों के एंड्रॉयड बंडल कार्यान्वयन के बाद के संस्करण।
    • पहले एंड्रॉइड (< 26) के लिए, ThreeTenABP प्रोजेक्ट थ्रीटेन-बैकपोर्ट (उपरोक्त वर्णित) के अनुकूल है। How to use ThreeTenABP… देखें।

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

-1
private String returnMonthAsString(String month) {  
    if(month.equals("01")){ 
    return "January";  
    }else if(month.equals("02")){ 
     return "February"; 
    }else if(month.equals("03")){ 
     return "March"; 
    }else if(month.equals("04")){ 
     return "April"; 
    }else if(month.equals("05")){ 
     return "May"; 
    }else if(month.equals("06")){ 
     return "June"; 
    }else if(month.equals("07")){ 
     return "July"; 
    }else if(month.equals("08")){ 
     return "August"; 
    }else if(month.equals("09")){ 
     return "September"; 
    }else if(month.equals("10")){ 
     return "October"; 
    }else if(month.equals("11")){ 
     return "November"; 
    }else if(month.equals("12")){ 
     return "December"; 
    }else { 
     return null; 
    }   
} 
+0

यह बिल्कुल कुशल नहीं है – Benjamin

संबंधित मुद्दे

 संबंधित मुद्दे