Nom du mois sous forme de chaîne


89

J'essaie de renvoyer le nom du mois sous forme de chaîne, par exemple "mai", "septembre", "novembre".

J'ai essayé:

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

Cependant, cela renvoie des entiers (5, 9, 11, respectivement). Comment puis-je obtenir le nom du mois?

Réponses:


88

Utilisez getDisplayName .

Pour une utilisation antérieure de l'API String.format(Locale.US,"%tB",c);


J'ai un problème: getDisplayName (month, Calendar.LONG, Locale.US) Et Eclipse me dit que Calendar.LONG ou Calendar.SHORT n'existent pas.
Gaby

C'est très étrange. Vous utilisez java.util.Calendaret pas une autre Calendarclasse, non?
vérité

Oui. Il semble que getDisplayName () et les Calendar.LONG et Calendar.SHORT associés sont de niveau API 9 uniquement. Donc, cela fonctionne pour le niveau 9, mais j'ai besoin pour le niveau 7 :(
Gaby

3
Formatter f = new Formatter();(vous pouvez éventuellement lui donner une locale) alors String monthName = f.format("%tB",c).toString();ou %tbpour un nom court.
vérité

5
utiliser également Locale.getDefault () au lieu de Locale.US pourrait être une bonne idée :)
Shine le

159

Utilisez ceci :

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

Le nom du mois contiendra le nom complet du mois, si vous voulez un nom de mois court, utilisez ceci

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

13
"MMMM" suffirait pour le premier cas.
yanchenko

114

Pour obtenir le mois dans la variable de chaîne, utilisez le code ci-dessous

Par exemple le mois de septembre:

M -> 9

MM -> 09

MMM -> sept

MMMM -> Septembre

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

1
oui, merci, ça marche comme un charme, dans toutes les langues que j'utilise (français, anglais, allemand)
Chrysotribax

45

"MMMM" n'est certainement PAS la bonne solution (même si cela fonctionne pour de nombreuses langues), utilisez le modèle "LLLL" avec SimpleDateFormat

La prise en charge de `` L '' comme extension compatible ICU pour les noms de mois autonomes a été ajoutée à la plate-forme Android en juin 2010 .

Même si en anglais il n'y a pas de différence entre le codage par «MMMM» et «LLLL», vous devriez également penser à d'autres langues.

Par exemple, voici ce que vous obtenez, si vous utilisez Calendar.getDisplayNameou le modèle "MMMM" pour janvier avec le russe Locale:

января (qui est correct pour une chaîne de date complète: " 10 января, 2014 ")

mais dans le cas d'un nom de mois autonome, vous attendez:

январь

La bonne solution est:

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

Si vous êtes intéressé par la provenance de toutes les traductions, voici la référence aux traductions de calendriers grégoriens (autres calendriers liés en haut de la page).


'LLLL' n'est disponible que depuis Java 8, vous pouvez utiliser 'MMMM' avec SimpleDateFormat et cela fonctionne parfaitement bien pour la version autonome également.
juanheyns

23

Aussi simple que ça

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

Calendar.LONG est d'obtenir le nom complet du mois et Calendar.SHORT donne le nom en bref. Par exemple: Calendar.LONG renverra le calendrier de janvier, tandis que SHORT renverra Jan


Très bonne réponse. J'étais en train de régler le calendrier par moi-même pour l'alarme et j'avais besoin d'obtenir le nom du mois plus tard. Réponse parfaite Merci
Ajji

10

Je garde cette réponse qui est utile pour d'autres cas, mais la réponse @trutheality semble être le moyen le plus simple et direct.

Vous pouvez utiliser DateFormatSymbols

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

5

Le seul moyen sur Android d'obtenir le nom du mois stanalone correctement formaté pour des langues telles que l'ukrainien, le russe, le tchèque

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

Testé sur l'API 15-25

La sortie pour mai est Май mais pas Мая


3

Russe.

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

май

Anglais aux États-Unis.

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

Mai

Voir ce code exécuté en direct sur IdeOne.com .

ThreeTenABP et java.time

Voici la réponse moderne. Lorsque cette question a été posée en 2011, Calendarelle GregorianCalendarétait couramment utilisée pour les dates et heures même si elles étaient toujours mal conçues. Cela fait 8 ans maintenant, et ces classes sont dépassées depuis longtemps. En supposant que vous n'êtes pas encore au niveau de l'API 26, ma suggestion est d'utiliser la bibliothèque ThreeTenABP, qui contient un backport adapté Android de java.time, l'API moderne de date et d'heure Java. java.time est tellement plus agréable à utiliser.

En fonction de vos besoins exacts et de votre situation, il existe deux options:

  1. Utilisation Monthet sa getDisplayNameméthode.
  2. Utilisez un DateTimeFormatter.

Utiliser le mois

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

La sortie de cet extrait de code est:

Mai

Dans quelques langues, cela fera une différence que vous utilisiez TextStyle.FULLou TextStyle.FULL_STANDALONE. Vous devrez voir, peut-être vérifier avec vos utilisateurs, lequel des deux correspond à votre contexte.

Utilisez un DateTimeFormatter

Si vous avez un rendez-vous avec ou sans heure de la journée, je trouve un rendez-vous DateTimeFormatterplus pratique. Par exemple:

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

Je montre l'utilisation d'un ZonedDateTime, le remplacement le plus proche de l'ancienne Calendarclasse. Le code ci - dessus fonctionne pour un LocalDate, un LocalDateTime, MonthDay, OffsetDateTimeet YearMonthaussi.

Que faire si vous avez une CalendarAPI héritée qui n'a pas encore été mise à niveau vers java.time? Convertissez en a ZonedDateTimeet procédez comme ci-dessus:

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

Le reste est le même qu'avant.

Question: java.time ne nécessite-t-il pas le niveau d'API Android 26?

java.time fonctionne bien sur les appareils Android plus anciens et plus récents. Il nécessite juste au moins Java 6 .

  • Dans Java 8 et versions ultérieures et sur les appareils Android plus récents (à partir du niveau d'API 26), l'API moderne est intégrée.
  • Dans Java 6 et 7 non-Android, obtenez le ThreeTen Backport, le backport des classes modernes (ThreeTen pour JSR 310; voir les liens en bas).
  • Sur Android (plus ancien), utilisez l'édition Android de ThreeTen Backport. Il s'appelle ThreeTenABP. Et assurez-vous d'importer les classes de date et d'heure à partir des org.threeten.bpsous-packages.

Liens


2

Je recommanderais d'utiliser un Calendarobjet et Localepuisque les noms de mois sont différents pour différentes langues:

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

Exemple pour le nom complet du mois:

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

Résultat: January

Exemple de nom de mois court:

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

Résultat: Jan


2

Un exemple de méthode pour obtenir la date et l'heure dans ce format "2018 Nov 01 16:18:22" utilisez ceci

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

0

Obtenir un nom de mois autonome est étonnamment difficile à exécuter «correctement» en Java. (Au moins au moment de la rédaction de cet article. J'utilise actuellement Java 8).

Le problème est que dans certaines langues, y compris le russe et le tchèque, la version autonome du nom du mois est différente de la version "formatage". De plus, il semble qu'aucune API Java ne vous fournisse simplement la "meilleure" chaîne. La majorité des réponses publiées ici jusqu'à présent n'offrent que la version de mise en forme. Vous trouverez ci-dessous une solution de travail pour obtenir la version autonome d'un seul nom de mois ou pour obtenir un tableau avec tous.

J'espère que cela fera gagner du temps à quelqu'un d'autre!

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

Obtenez le nom du mois en String.

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

Usage:

String monthName = getMonthName();

Envisagez de ne pas utiliser la SimpleDateFormatclasse et les amis longtemps démodés et notoirement gênants . Voyez si vous pouvez utiliser le désugarage ou ajouter ThreeTenABP à votre projet Android, afin d'utiliser java.time, l'API de date et d'heure Java moderne. C'est tellement plus agréable de travailler avec.
Ole VV

Contribuez-vous beaucoup qui ne figure pas déjà dans la réponse la plus votée de John?
Ole VV
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.