22 Stimmen

Wie kann man die Großschreibung von Monats- und Tagesnamen steuern, die von DateFormat zurückgegeben werden?

Hier ist ein schnelles Testprogramm:

    public static void main( String[] args )
{
    Date date = Calendar.getInstance().getTime();

    System.out.println("Months:");
    printDate( "MMMM", "en", date );
    printDate( "MMMM", "es", date );
    printDate( "MMMM", "fr", date );
    printDate( "MMMM", "de", date );

    System.out.println("Days:");
    printDate( "EEEE", "en", date );
    printDate( "EEEE", "es", date );
    printDate( "EEEE", "fr", date );
    printDate( "EEEE", "de", date );

}

public static void printDate( String format, String locale, Date date )
{
    System.out.println( locale + ": " + (new SimpleDateFormat( format, new Locale( locale ) )).format( date ) );
}

Die Ausgabe ist:

Months: en: September es: septiembre fr: septembre de: September Days: en: Monday es: lunes fr: lundi de: Montag

Wie kann ich die Großschreibung der Namen kontrollieren? Aus irgendeinem Grund scheinen die Spanier und Franzosen immer Namen zu liefern, die mit einem Kleinbuchstaben beginnen.

18voto

brabster Punkte 41159

Nicht alle Sprachen haben die gleichen Regeln für die englische Großschreibung. Ich schätze, Sie müssten die von der API verwendeten Daten ändern, aber Ihre nicht-englischen Kunden werden das vielleicht nicht schätzen...

about.com zur französischen Kapitalisierung

8voto

Dan Dyer Punkte 52915

Die Großschreibung ist in den verschiedenen Sprachen unterschiedlich geregelt. Im Französischen werden die Monatsnamen sollte nicht großgeschrieben werden .

5voto

Chris Shaffer Punkte 31499

Möglicherweise möchten Sie die Großschreibung nicht ändern - in verschiedenen Kulturen werden unterschiedliche Wörter großgeschrieben (im Deutschen zum Beispiel wird jedes Substantiv großgeschrieben, nicht nur Eigennamen).

5voto

Basil Bourque Punkte 256611

Tl;dr

Wie kann ich die Großschreibung der Namen kontrollieren?

Sie haben keine. In verschiedenen Sprachen und Kulturen gelten unterschiedliche Regeln für Großschreibung, Zeichensetzung, Abkürzungen usw.

getDisplayName - automatisch lokalisieren

Month.from( LocalDate.now( ZoneId.of( "Pacific/Auckland" ) ) )    // Get current month.
     .getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )     // Localize automatically. Specify `Locale` to determine human language and cultural norms for translation. 

février

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )                  // Get current date as seen by people in a certain region (time zone).
    .getDayOfWeek()                                               // Get the day-of-week as a pre-defined `DayOfWeek` enum object.
    .getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH )

lundi

Lokalisieren Sie

Wie bereits von anderen erwähnt, sollten Sie nicht Ihre eigenen parochialen (US-Englisch?) Vorstellungen von Großschreibung erzwingen. Verwenden Sie eine anständige Datum-Zeit-Bibliothek, und lassen Sie es automatisch für Sie lokalisieren.

java.time

Sie verwenden schreckliche alte Datum-Zeit-Klassen, die jetzt veraltet sind und von den java.time-Klassen verdrängt wurden.

Le site LocalDate stellt einen reinen Datumswert ohne Uhrzeit und ohne Zeitzone dar.

Die Zeitzone ist für die Bestimmung eines Datums entscheidend. Zu jedem beliebigen Zeitpunkt variiert das Datum je nach Zeitzone rund um den Globus. Zum Beispiel, ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag und dennoch "gestern" in Montréal Québec .

Geben Sie eine Name der richtigen Zeitzone im Format von continent/region , wie zum Beispiel America/Montreal , Africa/Casablanca o Pacific/Auckland . Verwenden Sie niemals eine Abkürzung mit 3-4 Buchstaben wie z. B. EST o IST wie sie sind no echte Zeitzonen, nicht genormt und nicht einmal eindeutig(!).

ZoneId z = ZoneId.of( "Asia/Kolkata" );
LocalDate today = LocalDate.now( z );

Um mit einem Monat zu arbeiten, extrahieren Sie eine Month enum-Objekt. Das Gleiche gilt für den Wochentag, DayOfWeek .

Rufen Sie an. getDisplayName . Pass a TextStyle für die Abkürzung. Pass a Locale um (a) die menschliche Sprache für die Übersetzung von Tagesnamen, Monatsnamen usw. und (b) die kulturellen Normen zu bestimmen, die über Fragen der Abkürzung, Großschreibung, Zeichensetzung, Trennzeichen usw. entscheiden. Beachten Sie, dass Locale tiene nichts mit der Zeitzone zu tun.

Month m = today.getMonth() ;
String mNameQuébec = m.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
String mNameGermany = m.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ; 

und

DayOfWeek dow = today.getDayOfWeek() ;
String dowNameQuébec = dow.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH ) ; 
String dowNameGermany = dow.getDisplayName( TextStyle.FULL , Locale.GERMANY ) ; 

Über java.time

Le site java.time Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Erbe Datum-Zeit-Klassen wie java.util.Date , Calendar , & SimpleDateFormat .

Le site Joda-Time Projekt, jetzt in Wartungsmodus rät zur Migration auf den java.time Klassen.

Weitere Informationen finden Sie in der Oracle-Tutorial . Und suchen Sie auf Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 310 .

Mit einem JDBC-Treiber einhaltend JDBC 4.2 oder später, können Sie umtauschen java.time Objekte direkt mit Ihrer Datenbank. Sie brauchen keine Strings oder java.sql.*-Klassen.

Wo erhält man die java.time-Klassen?

  • Java SE 8 , Java SE 9 und später
    • Eingebaut.
    • Teil der Standard-Java-API mit einer gebündelten Implementierung.
    • Java 9 fügt einige kleinere Funktionen und Korrekturen hinzu.
  • Java SE 6 y Java SE 7
    • Ein Großteil der java.time-Funktionalität wurde in Java 6 und 7 zurückportiert in DreiZehn-Backport .
  • Android
    • Spätere Versionen von Android bündeln Implementierungen der java.time-Klassen.
    • Bei früheren Android-Versionen ist die DreiZehnABP Projekt passt sich an DreiZehn-Backport (siehe oben). Siehe Wie benutzt man ThreeTenABP .

Le site DreiZehn-Extra Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt dient als Versuchsfeld für mögliche zukünftige Erweiterungen von java.time. Sie finden hier vielleicht einige nützliche Klassen wie Interval , YearWeek , YearQuarter y mehr .

0voto

rajat banerjee Punkte 1198

Ich habe jetzt ein Problem, bei dem ein Satz mit "dimanche 07 mars" beginnt, was keine Rolle spielen würde, wenn es nicht am Anfang eines Satzes stünde. Ich vermute, dass dies nicht geändert werden kann, es sei denn, ich führe eine manuelle Stringmanipulation am ersten Zeichen des Strings durch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X