Attention, les mois Java sont basés sur zéro, donc 0 = janvier, 1 = février, etc.
Nick Holt
vous avez raison, donc si vous avez besoin de changer de langue, il vous suffit de changer les paramètres régionaux. Merci
Atomfat
2
@NickHolt UPDATE L' java.timeMonthénumération moderne est basée sur un: 1-12 pour janvier-décembre. Idem pour [ java.time.DayOfWeek](https://docs.oracle.com/javase/9/docs/api/java/time/DayOfWeek.html): 1-7 for Monday-Sunday per ISO 8601 standard. Only the troublesome old legacy date-time classes such as Calendar` ont des schémas de numérotation fous. Une des nombreuses raisons d'éviter les anciennes classes, désormais entièrement supplantées par les classes java.time .
IL a besoin month-1. Quiconque utilise Calendar.get(Calendar.MONTH)aura juste besoinmonth
Ron
1
L'implémentation de DateFormatSymbols a été modifiée dans JDK 8, donc la méthode getMonths ne renvoie plus les valeurs correctes pour tous les paramètres
ahaaman
33
Vous devez utiliser LLLL pour les noms de mois autonomes. ceci est documenté dans la SimpleDateFormatdocumentation, tel que:
SimpleDateFormat dateFormat =newSimpleDateFormat("LLLL",Locale.getDefault());
dateFormat.format( date );
JDK 1.7 /IllegalArgumentException : Illegal pattern character 'L'
AntJavaDev
26
tl; dr
Month// Enum class, predefining and naming a dozen objects, one for each month of the year. .of(12)// Retrieving one of the enum objects by number, 1-12. .getDisplayName(TextStyle.FULL_STANDALONE ,Locale.CANADA_FRENCH // Locale determines the human language and cultural norms used in localizing. )
java.time
Depuis Java 1.8 (ou 1.7 et 1.6 avec le ThreeTen-Backport ), vous pouvez utiliser ceci:
Notez qu'il integerMonthest basé sur 1, c'est-à-dire que 1 correspond à janvier. La plage est toujours de 1 à 12 pour janvier-décembre (c.-à-d. Calendrier grégorien uniquement).
disons que vous avez le mois de mai en français en utilisant la méthode que vous avez postée (mai en français est Mai), comment puis-je obtenir le numéro 5 de cette chaîne ??
usertest
@usertest J'ai écrit un brouillon de classe MonthDelocalizerdans ma réponse pour obtenir un Monthobjet à partir d'une chaîne de nom de mois localisée passée: mai→ Month.MAY. Notez que le respect de la casse est important: en français, Main'est pas valide et devrait l'être mai.
Basil Bourque
Nous sommes en 2019. Comment n'est-ce pas la meilleure réponse?
anothernode
16
J'utiliserais SimpleDateFormat. Quelqu'un me corrige s'il existe un moyen plus simple de créer un calendrier mensuel, je le fais maintenant dans le code et je n'en suis pas si sûr.
/**
* Get the month name of a Date. e.g. January for the Date 2011-01-01
*
* @param date
* @return e.g. "January"
*/publicstaticString 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;}
"Apparemment, dans Android 2.2, il y a un bogue" - Ce serait utile si vous pouviez créer un lien vers l'endroit où le bogue est suivi.
Peter Hall
6
tl; dr
Month.of( yourMonthNumber )// Represent a month by its number, 1-12 for January-December. .getDisplayName(// Generate text of the name of the month automatically localized. TextStyle.SHORT_STANDALONE ,// Specify how long or abbreviated the name of month should be.newLocale("es","MX")// Locale determines (a) the human language used in translation, and (b) the cultural norms used in deciding issues of abbreviation, capitalization, punctuation, and so on.)// Returns a String.
java.time.Month
Beaucoup plus facile à faire maintenant dans les classes java.time qui remplacent ces anciennes classes de date-heure héritées.
L' Monthénumération définit une douzaine d'objets, un pour chaque mois.
Les mois sont numérotés de 1 à 12 pour janvier-décembre.
Ajustez le TextStylepour spécifier la longueur ou l'abréviation du nom. Notez que dans certaines langues (pas l'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 …_STANDALONEvariante.
Quelle langue humaine doit être utilisée dans la traduction.
Quelles normes culturelles devraient décider des questions telles que l'abréviation, la ponctuation et la capitalisation.
Exemple:
Locale l =newLocale("es","MX");String output =Month.FEBRUARY.getDisplayName(TextStyle.SHORT_STANDALONE , l );// Or Locale.US, Locale.CANADA_FRENCH.
Nom → Monthobjet
Pour info, aller dans l'autre sens (analyser une chaîne de nom du mois pour obtenir un Monthobjet enum) n'est pas intégré. Vous pouvez écrire votre propre classe pour le faire. Voici ma tentative rapide pour une telle classe. Utilisez à vos risques et périls . Je n'ai donné à ce code aucune pensée sérieuse ni aucun test sérieux.
Usage.
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.publicclassMonthDelocalizer{@NotNullprivateLocale locale;@NotNullprivateList<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.privateMonthDelocalizer(@NotNullLocale 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 =newArrayList<>( countMonthsInYear );this.monthNamesStandalone =newArrayList<>( 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 BourqueprivateMonthDelocalizer(){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.synchronizedstaticpublicMonthDelocalizer of (@NotNullLocale localeArg ){MonthDelocalizer x =newMonthDelocalizer( 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`.@NullablepublicMonth parse (@NotNullString 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 ){thrownew java.lang.IllegalArgumentException("The passed month name: ‘"+ input +"’ is not valid for locale: "+this.locale.toString());}return m;}// `Object` class overrides.@Overridepublicboolean equals (Object o ){if(this== o )returntrue;if( o ==null|| getClass()!= o.getClass())returnfalse;MonthDelocalizer that =(MonthDelocalizer) o;return locale.equals( that.locale );}@Overridepublicint hashCode (){return locale.hashCode();}publicstaticvoid main (String[] args ){// Usage example:MonthDelocalizer monthDelocJapan =MonthDelocalizer.of(Locale.JAPAN );try{Month m = monthDelocJapan.parse("pink elephant");// Invalid input.}catch(IllegalArgumentException e ){// … handle errorSystem.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.");}}}
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de java.sql.*classes.
Versions ultérieures des implémentations de bundle Android des classes java.time.
Pour les versions antérieures d'Android (<26), le versionsprojetThreeTenABPadapteThreeTen-Backport(mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval,YearWeek , YearQuarteret plus .
Il y a un problème lorsque vous utilisez la classe DateFormatSymbols pour sa méthode getMonthName pour obtenir Month by Name, il affiche Month by Number sur certains appareils Android. J'ai résolu ce problème en procédant de cette façon:
La Calendarclasse terrible a été supplantée il y a des années par les classes java.time définies dans JSR 310.
Basil Bourque
0
publicstaticvoid main(String[] args){SimpleDateFormat format =newSimpleDateFormat("MMMMM",newLocale("en","US"));System.out.println(format.format(newDate()));}
DateFormatSymbolsfait partie des terribles classes de date-heure qui sont maintenant héritées, depuis l'adoption de JSR 310 . Désormais supplanté par les classes java.time . Suggérer leur utilisation en 2019 est un mauvais conseil.
java.timeMonth
énumération moderne est basée sur un: 1-12 pour janvier-décembre. Idem pour [java.time.DayOfWeek](https://docs.oracle.com/javase/9/docs/api/java/time/DayOfWeek.html): 1-7 for Monday-Sunday per ISO 8601 standard. Only the troublesome old legacy date-time classes such as
Calendar` ont des schémas de numérotation fous. Une des nombreuses raisons d'éviter les anciennes classes, désormais entièrement supplantées par les classes java.time .Réponses:
la source
month-1
. Quiconque utiliseCalendar.get(Calendar.MONTH)
aura juste besoinmonth
Vous devez utiliser LLLL pour les noms de mois autonomes. ceci est documenté dans la
SimpleDateFormat
documentation, tel que:la source
IllegalArgumentException : Illegal pattern character 'L'
tl; dr
java.time
Depuis Java 1.8 (ou 1.7 et 1.6 avec le ThreeTen-Backport ), vous pouvez utiliser ceci:
Notez qu'il
integerMonth
est basé sur 1, c'est-à-dire que 1 correspond à janvier. La plage est toujours de 1 à 12 pour janvier-décembre (c.-à-d. Calendrier grégorien uniquement).la source
MonthDelocalizer
dans ma réponse pour obtenir unMonth
objet à partir d'une chaîne de nom de mois localisée passée:mai
→ Month.MAY. Notez que le respect de la casse est important: en français,Mai
n'est pas valide et devrait l'êtremai
.J'utiliserais SimpleDateFormat. Quelqu'un me corrige s'il existe un moyen plus simple de créer un calendrier mensuel, je le fais maintenant dans le code et je n'en suis pas si sûr.
la source
Voici comment je le ferais. Je vous laisse le contrôle de la distance
int month
.la source
Utilisation de SimpleDateFormat.
Résultat: février
la source
Apparemment, dans Android 2.2, il y a un bogue avec SimpleDateFormat.
Pour utiliser les noms de mois, vous devez les définir vous-même dans vos ressources:
Et puis utilisez-les dans votre code comme ceci:
la source
tl; dr
java.time.Month
Beaucoup plus facile à faire maintenant dans les classes java.time qui remplacent ces anciennes classes de date-heure héritées.
L'
Month
énumération définit une douzaine d'objets, un pour chaque mois.Les mois sont numérotés de 1 à 12 pour janvier-décembre.
Demandez à l'objet de générer une chaîne du nom du mois, automatiquement localisée .
Ajustez le
TextStyle
pour spécifier la longueur ou l'abréviation du nom. Notez que dans certaines langues (pas l'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…_STANDALONE
variante.Spécifiez un
Locale
pour déterminer:Exemple:
Nom →
Month
objetPour info, aller dans l'autre sens (analyser une chaîne de nom du mois pour obtenir un
Month
objet enum) n'est pas intégré. Vous pouvez écrire votre propre classe pour le faire. Voici ma tentative rapide pour une telle classe. Utilisez à vos risques et périls . Je n'ai donné à ce code aucune pensée sérieuse ni aucun test sérieux.Usage.
Code.
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous pouvez trouver ici quelques classes utiles telles que
Interval
,YearWeek
,YearQuarter
et plus .la source
Il y a un problème lorsque vous utilisez la classe DateFormatSymbols pour sa méthode getMonthName pour obtenir Month by Name, il affiche Month by Number sur certains appareils Android. J'ai résolu ce problème en procédant de cette façon:
Dans String_array.xml
Dans la classe Java, appelez simplement ce tableau comme suit:
Bon codage :)
la source
Extension Kotlin
Usage
la source
Calendar
classe terrible a été supplantée il y a des années par les classes java.time définies dans JSR 310.la source
SimpleDateFormat
classe notoirement gênante et dépassée depuis longtemps .Insérez simplement la ligne
fera l'affaire.
la source
DateFormatSymbols
fait partie des terribles classes de date-heure qui sont maintenant héritées, depuis l'adoption de JSR 310 . Désormais supplanté par les classes java.time . Suggérer leur utilisation en 2019 est un mauvais conseil.Essayez d'utiliser cela d'une manière très simple et appelez-le comme votre propre func
la source
Month::getDisplayName
.