Achtung, Java-Monate basieren auf Null, also 0 = Jan, 1 = Feb usw.
Nick Holt
Sie haben Recht. Wenn Sie also die Sprache ändern müssen, müssen Sie nur das Gebietsschema ändern. Danke
Atomefat
2
@NickHolt UPDATE Die moderne java.timeMonthAufzählung basiert auf einem: 1-12 für Januar-Dezember. Das Gleiche gilt für [ 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 Kalender` haben verrückte Nummerierungsschemata. Einer der vielen Gründe, die Legacy-Klassen zu vermeiden, die jetzt vollständig durch die java.time- Klassen ersetzt werden.
ER braucht month-1. Jeder andere, der es benutzt Calendar.get(Calendar.MONTH), braucht nurmonth
Ron
1
Die Implementierung von DateFormatSymbols wurde in JDK 8 geändert, sodass die Methode getMonths nicht mehr für alle Gebietsschemas die richtigen Werte zurückgibt
ahaaman
33
Sie müssen LLLL für eigenständige Monatsnamen verwenden. Dies ist in der SimpleDateFormatDokumentation dokumentiert, z.
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. )
Beachten Sie, dass integerMonth1-basiert ist, dh 1 ist für Januar. Der Bereich reicht von Januar bis Dezember immer von 1 bis 12 (dh nur Gregorianischer Kalender).
Nehmen wir an, Sie haben den String-Monat Mai auf Französisch mit der von Ihnen angegebenen Methode (Mai auf Französisch ist Mai). Wie kann ich die Nummer 5 aus diesem String erhalten?
Usertest
@usertest Ich habe MonthDelocalizerin meiner Antwort eine Rohentwurfsklasse geschrieben , um ein MonthObjekt aus einer übergebenen lokalisierten Monatsnamenzeichenfolge maiabzurufen : → Month.MAY. Beachten Sie, dass die Groß- und Kleinschreibung wichtig ist: Auf Französisch Maiist ungültig und sollte es sein mai.
Basil Bourque
Es ist 2019. Wie ist das nicht die beste Antwort?
Anothernode
16
Ich würde SimpleDateFormat verwenden. Jemand korrigiert mich, wenn es einen einfacheren Weg gibt, einen Monatskalender zu erstellen. Ich mache das jetzt im Code und bin mir nicht so sicher.
Und verwenden Sie sie dann wie folgt in Ihrem Code:
/**
* 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;}
"Anscheinend gibt es in Android 2.2 einen Fehler" - Es wäre nützlich, wenn Sie einen Link zu dem Ort erstellen könnten, an dem der Fehler verfolgt wird.
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
In den java.time-Klassen, die diese problematischen alten Legacy-Datums- und Uhrzeitklassen ersetzen, ist dies jetzt viel einfacher.
Die MonthAufzählung definiert ein Dutzend Objekte, eines für jeden Monat.
Die Monate sind von Januar bis Dezember mit 1-12 nummeriert.
Passen Sie das TextStylean, um anzugeben, wie lange oder abgekürzt der Name sein soll. Beachten Sie, dass in einigen Sprachen (nicht Englisch) der Monatsname variiert, wenn er alleine oder als Teil eines vollständigen Datums verwendet wird. Jeder Textstil hat also eine …_STANDALONEVariante.
Welche menschliche Sprache sollte bei der Übersetzung verwendet werden?
Welche kulturellen Normen sollten über Themen wie Abkürzung, Zeichensetzung und Großschreibung entscheiden?
Beispiel:
Locale l =newLocale("es","MX");String output =Month.FEBRUARY.getDisplayName(TextStyle.SHORT_STANDALONE , l );// Or Locale.US, Locale.CANADA_FRENCH.
Name → MonthObjekt
Zu Ihrer Information: Wenn Sie in die andere Richtung gehen (eine Zeichenfolge mit dem Namen des Monats analysieren, um ein MonthEnum-Objekt zu erhalten), ist dies nicht integriert. Sie könnten dazu Ihre eigene Klasse schreiben. Hier ist mein kurzer Versuch in einer solchen Klasse. Benutzung auf eigene Gefahr . Ich habe diesen Code weder ernsthaft überlegt noch ernsthaft getestet.
Verwendung.
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.");}}}
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für java.sql.*Klassen.
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval, YearWeek, YearQuarter, und mehr .
Es gibt ein Problem, wenn Sie die DateFormatSymbols-Klasse für ihre getMonthName-Methode verwenden, um Monat für Name abzurufen. Auf einigen Android-Geräten wird Monat für Nummer angezeigt. Ich habe dieses Problem folgendermaßen gelöst:
Die schreckliche CalendarKlasse wurde vor Jahren durch die in JSR 310 definierten Java.time- Klassen ersetzt.
Basil Bourque
0
publicstaticvoid main(String[] args){SimpleDateFormat format =newSimpleDateFormat("MMMMM",newLocale("en","US"));System.out.println(format.format(newDate()));}
DateFormatSymbolsist Teil der schrecklichen Datums- und Uhrzeitklassen, die seit der Einführung von JSR 310 Legacy sind . Jetzt ersetzt durch die java.time- Klassen. Die Verwendung im Jahr 2019 vorzuschlagen, ist ein schlechter Rat.
java.timeMonth
Aufzählung basiert auf einem: 1-12 für Januar-Dezember. Das Gleiche gilt für [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
Kalender` haben verrückte Nummerierungsschemata. Einer der vielen Gründe, die Legacy-Klassen zu vermeiden, die jetzt vollständig durch die java.time- Klassen ersetzt werden.Antworten:
quelle
month-1
. Jeder andere, der es benutztCalendar.get(Calendar.MONTH)
, braucht nurmonth
Sie müssen LLLL für eigenständige Monatsnamen verwenden. Dies ist in der
SimpleDateFormat
Dokumentation dokumentiert, z.quelle
IllegalArgumentException : Illegal pattern character 'L'
tl; dr
java.time
Seit Java 1.8 (oder 1.7 & 1.6 mit dem ThreeTen-Backport ) können Sie Folgendes verwenden:
Beachten Sie, dass
integerMonth
1-basiert ist, dh 1 ist für Januar. Der Bereich reicht von Januar bis Dezember immer von 1 bis 12 (dh nur Gregorianischer Kalender).quelle
MonthDelocalizer
in meiner Antwort eine Rohentwurfsklasse geschrieben , um einMonth
Objekt aus einer übergebenen lokalisierten Monatsnamenzeichenfolgemai
abzurufen : → Month.MAY. Beachten Sie, dass die Groß- und Kleinschreibung wichtig ist: Auf FranzösischMai
ist ungültig und sollte es seinmai
.Ich würde SimpleDateFormat verwenden. Jemand korrigiert mich, wenn es einen einfacheren Weg gibt, einen Monatskalender zu erstellen. Ich mache das jetzt im Code und bin mir nicht so sicher.
quelle
So würde ich es machen. Ich überlasse es Ihnen, die Reichweite zu überprüfen
int month
.quelle
Verwenden von SimpleDateFormat.
Ergebnis: Februar
quelle
Anscheinend gibt es in Android 2.2 einen Fehler mit SimpleDateFormat.
Um Monatsnamen verwenden zu können, müssen Sie diese in Ihren Ressourcen selbst definieren:
Und verwenden Sie sie dann wie folgt in Ihrem Code:
quelle
tl; dr
java.time.Month
In den java.time-Klassen, die diese problematischen alten Legacy-Datums- und Uhrzeitklassen ersetzen, ist dies jetzt viel einfacher.
Die
Month
Aufzählung definiert ein Dutzend Objekte, eines für jeden Monat.Die Monate sind von Januar bis Dezember mit 1-12 nummeriert.
Bitten Sie das Objekt, eine Zeichenfolge mit dem Namen des Monats zu generieren , die automatisch lokalisiert wird .
Passen Sie das
TextStyle
an, um anzugeben, wie lange oder abgekürzt der Name sein soll. Beachten Sie, dass in einigen Sprachen (nicht Englisch) der Monatsname variiert, wenn er alleine oder als Teil eines vollständigen Datums verwendet wird. Jeder Textstil hat also eine…_STANDALONE
Variante.Geben Sie a
Locale
an, um Folgendes zu bestimmen:Beispiel:
Name →
Month
ObjektZu Ihrer Information: Wenn Sie in die andere Richtung gehen (eine Zeichenfolge mit dem Namen des Monats analysieren, um ein
Month
Enum-Objekt zu erhalten), ist dies nicht integriert. Sie könnten dazu Ihre eigene Klasse schreiben. Hier ist mein kurzer Versuch in einer solchen Klasse. Benutzung auf eigene Gefahr . Ich habe diesen Code weder ernsthaft überlegt noch ernsthaft getestet.Verwendung.
Code.
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Es gibt ein Problem, wenn Sie die DateFormatSymbols-Klasse für ihre getMonthName-Methode verwenden, um Monat für Name abzurufen. Auf einigen Android-Geräten wird Monat für Nummer angezeigt. Ich habe dieses Problem folgendermaßen gelöst:
In String_array.xml
Rufen Sie in der Java-Klasse dieses Array einfach folgendermaßen auf:
Viel Spaß beim Codieren :)
quelle
Kotlin-Erweiterung
Verwendung
quelle
Calendar
Klasse wurde vor Jahren durch die in JSR 310 definierten Java.time- Klassen ersetzt.quelle
SimpleDateFormat
Klasse.Einfach die Zeile einfügen
wird den Trick machen.
quelle
DateFormatSymbols
ist Teil der schrecklichen Datums- und Uhrzeitklassen, die seit der Einführung von JSR 310 Legacy sind . Jetzt ersetzt durch die java.time- Klassen. Die Verwendung im Jahr 2019 vorzuschlagen, ist ein schlechter Rat.Versuchen Sie dies auf sehr einfache Weise zu verwenden und nennen Sie es wie Ihre eigene Funktion
quelle
Month::getDisplayName
.