Comment puis-je convertir un entier en nom de mois localisé en Java?

j'obtiens un entier et j'ai besoin de convertir en noms de mois dans diverses locales:

exemple pour locale en-us:

1 - > janvier

2 - > février 151910920"

exemple pour locale es-mx:

1 - > Enero

2 - > Febrero

84
demandé sur Sinan Ünür 2009-06-24 18:00:50

10 réponses

import java.text.DateFormatSymbols;
public String getMonth(int month) {
    return new DateFormatSymbols().getMonths()[month-1];
}
180
répondu joe 2009-06-24 14:07:42

vous devez utiliser LLLL pour les noms de mois autonomes. ceci est documenté dans la documentation SimpleDateFormat , telle que:

SimpleDateFormat dateFormat = new SimpleDateFormat( "LLLL", Locale.getDefault() );
dateFormat.format( date );
31
répondu Ilya Lisway 2013-01-30 12:47:40

J'utiliserais SimpleDateFormat. Quelqu'un me corriger s'il y a un moyen plus facile de faire un calendrier monthed cependant, je le fais en code maintenant et je ne suis pas si sûr.

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());
}
15
répondu stevedbrown 2015-03-31 18:38:37

voilà comment je le ferais. Je vous laisse vérifier la portée du 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];
}
13
répondu Bill the Lizard 2009-06-24 14:12:28

Utilisant 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"); 

Résultat: Février

10
répondu Terence 2012-01-05 13:09:57

apparemment dans Android 2.2 il y a un bug avec SimpleDateFormat.

afin d'utiliser les noms de mois, vous devez définir vous-même dans vos ressources:

<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>

et puis utilisez-les dans votre code comme ceci:

/**
 * 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;
}
7
répondu IHeartAndroid 2016-03-15 08:34:18

de java.temps

depuis Java 1.8 (ou 1.7 & 1.6 avec le ThreeTen-Backport ) vous pouvez utiliser ceci:

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

notez que integerMonth est basé sur 1, i.e. 1 est pour janvier. L'intervalle est toujours de 1 à 12 pour janvier-décembre (c.-à-d. calendrier grégorien seulement).

7
répondu Oliv 2018-03-05 00:14:06

tl; dr

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

java.time.Month

Beaucoup plus facile à faire maintenant, dans le java.les classes de temps qui supplantent ces vieilles classes de date héritées gênantes.

le Month enum définit une douzaine d'objets, un pour chaque mois.

les mois sont numérotés 1-12 pour janvier-décembre.

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

demandez à l'objet de générer un Chaîne du nom du mois, automatiquement localisé .

ajustez le TextStyle pour spécifier combien de temps ou abrégé vous voulez le nom. Notez que dans certaines langues (pas en anglais) le nom du mois varie s'il est utilisé seul ou dans le cadre d'une date complète. Ainsi, chaque style de texte a une variante …_STANDALONE .

spécifier un Locale pour déterminer:

  • quelle langue humaine doit être utilisée dans la traduction.
  • Ce que les normes culturelles doivent se prononcer sur des questions telles que les abréviations, la ponctuation et les majuscules.

exemple:

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

"1519190920 Nom" → Month objet

POUR INFO, aller dans l'autre direction (analyser une chaîne du nom du mois pour obtenir un objet Month enum) n'est pas intégré. Vous pouvez écrire votre propre classe pour le faire. Voici ma tentative rapide à un tel cours. Utiliser à vos risques et périls . Je n'ai donné ce code aucune pensée sérieuse ni aucun test sérieux.

"1519230920 d'Utilisation".

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

Code.

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." );
        }
    }
}

à Propos de de java.heure

Le de java.heure framework est intégré à Java 8 et plus tard. Ces classes supplantent les anciennes classes de date legacy telles que java.util.Date , Calendar , & SimpleDateFormat .

le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers le java.temps des classes.

pour en savoir plus, voir le tutoriel Oracle . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .

vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un JDBC driver conforme à JDBC 4.2 ou plus tard. Aucun besoin de Chaînes, pas besoin de classes java.sql.* .

où obtenir le java.les classes de temps?

ThreeTen-Extra " le projet étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'expérimentation pour d'éventuelles futures additions à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval , YearWeek , YearQuarter , et plus .

4
répondu Basil Bourque 2018-03-09 20:52:18

Il ya un problème lorsque vous utilisez la classe DateFormatSymbols pour sa méthode getMonthName pour obtenir mois par nom, il Afficher mois par numéro dans certains appareils Android. J'ai résolu ce problème en faisant de cette façon:

Dans String_array.xml

<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>

dans la classe Java, appelez simplement ce tableau comme ceci:

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);

            }

Codage Heureux :)

1
répondu Faakhir 2015-03-09 08:57:14
    public static void main(String[] args) {
    SimpleDateFormat format = new SimpleDateFormat("MMMMM", new Locale("en", "US"));
    System.out.println(format.format(new Date()));
}
0
répondu Diogo Oliveira 2016-06-07 20:52:53