Frage

Ich versuche, auf unterschiedliche Weise ein Datum in Java zu formatieren, auf der Grundlage des angegebenen Gebietsschema. Zum Beispiel ich Englisch Benutzer sehen sollen "1. November 2009" (formatiert von "MMM d, yyyy") und die norwegische Benutzer sehen "1. November 2009" ( "d. MMM. Yyyy").

Der Monat Teil funktioniert OK, wenn ich das Gebietsschema auf das Simple Konstruktor hinzufügen, aber was ist mit dem Rest?

Ich habe gehofft, ich Format-Strings mit Locales Simple gepaart hinzufügen könnte, aber ich kann keine Möglichkeit, dies zu tun. Ist es möglich, oder muß ich meinen Code Check das Gebietsschema lassen und den entsprechenden Format-String hinzufügen?

War es hilfreich?

Lösung

Mit DateFormat.getDateInstance (int Stil, locale locale) statt Ihre eigenen Muster mit SimpleDateFormat zu schaffen.

Andere Tipps

SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE dd MMM yyyy", Locale.ENGLISH);
String formatted = dateFormat.format(the_date_you_want_here);

Mit dem style + locale : DateFormat.getDateInstance (int Stil, Locale locale)

Überprüfen Sie http: //java.sun .com / j2se / 1.5.0 / docs / api / java / text / DateFormat.html

Führen Sie das folgende Beispiel die Unterschiede zu sehen:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatDemoSO {
  public static void main(String args[]) {
    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    System.out.println("USA: " + df.format(date));   
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    System.out.println("France: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    System.out.println("Italy: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    System.out.println("Japan: " + df.format(date));
  }
}

Ausgabe:

United Kingdom: 25-Sep-2017
USA: Sep 25, 2017
France: 25 sept. 2017
Italy: 25-set-2017
Japan: 2017/09/25

tl; dr

LocalDate.now().format(
    DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM )
                     .withLocale( new Locale( "no" , "NO" ) )
)

Die lästigen Klassen von java.util.Date und SimpleDateFormat sind jetzt Erbe, durch die java.time Klassen verdrängte.

LocalDate

Die LocalDate Klasse repräsentiert ein Datum -nur Wert ohne Zeit-of-Tag und ohne Zeitzone.

Eine Zeitzone ist entscheidend, ein Datum zu bestimmen. Für jeden gegebenen Moment ändert sich das Datum auf der ganzen Welt durch Zone. Zum Beispiel, ein paar Minuten nach Mitternacht in Paris Frankreich ist ein neuer Tag, während noch „gestern “in Montréal Québec .

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

DateTimeFormatter

Verwenden Sie DateTimeFormatter Strings erzeugen, die nur den Datumsteil oder den Zeitabschnitt.

Die DateTimeFormatter Klasse kann automatisch lokalisieren .

Zur Lokalisierung Folgendes an:

  • FormatStyle zu bestimmen, wie lang oder kurz sollte die Zeichenfolge sein.
  • Locale zu bestimmen (a) die menschliche Sprache für die Übersetzung des Namens des Tages, Name des Monats, und so, und (b) die kulturellen Normen Fragen der Abkürzung, Großschreibung, Zeichensetzung und so zu entscheiden.

Beispiel:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( l );
String output = ld.format( f );

Möchten Sie in die andere Richtung, können Sie einen lokalisierten String analysieren.

LocalDate ld = LocalDate.parse( input , f );
Hinweis

, dass die locale und Zeitzone sind vollständig orthogonal Fragen. Sie können einen Montréal Moment in der japanischen Sprache vorgestellt haben oder ein Auckland Neuseeland Moment in Hindi Sprache präsentiert.

Ein weiteres Beispiel: Ändern 6 junio 2012 (Spanisch) 2012-06-06 (Standard ISO 8601 -Format). Die java.time Klassen verwenden ISO 8601-Formate standardmäßig für das Parsen / Erzeugen von Strings.

String input = "6 junio 2012";
Locale l = new Locale ( "es" , "ES" );
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "d MMMM uuuu" , l );
LocalDate ld = LocalDate.parse ( input , f );
String output = ld.toString();  // 2012-06-06. 

Peruse Formate

Hier einige Beispiel-Code, die Ergebnisse von mehreren Formaten in verschiedene Locales für Durchlesen automatisch lokalisiert.

Ein EnumSet ist eine Implementierung von Set , hoch optimiert für Low Speichernutzung Einfache und schnelle Ausführungsgeschwindigkeit beim Sammeln Enum Objekte. So gibt EnumSet.allOf( FormatStyle.class ) uns eine Sammlung von allen vier der FormatStyle enum Objekte Schleife. Für weitere Informationen siehe Oracle Tutorial auf Aufzählungstypen .

LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 );

List < Locale > locales = new ArrayList <>( 3 );
locales.add( Locale.CANADA_FRENCH );
locales.add( new Locale( "no" , "NO" ) );
locales.add( Locale.US );

// Or use all locales (almost 800 of them, for about 120K text results).
// Locale[] locales = Locale.getAvailableLocales(); // All known locales. Almost 800 of them.

for ( Locale locale : locales )
{
    System.out.println( "------|  LOCALE: " + locale + " — " + locale.getDisplayName() + "  |----------------------------------" + System.lineSeparator() );

    for ( FormatStyle style : EnumSet.allOf( FormatStyle.class ) )
    {
        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( style ).withLocale( locale );
        String output = ld.format( f );
        System.out.println( output );
    }
    System.out.println( "" );
}
System.out.println( "« fin »" + System.lineSeparator() );

Ausgabe.

------|  LOCALE: fr_CA — French (Canada)  |----------------------------------

mardi 23 janvier 2018
23 janvier 2018
23 janv. 2018
18-01-23

------|  LOCALE: no_NO — Norwegian (Norway)  |----------------------------------

tirsdag 23. januar 2018
23. januar 2018
23. jan. 2018
23.01.2018

------|  LOCALE: en_US — English (United States)  |----------------------------------

Tuesday, January 23, 2018
January 23, 2018
Jan 23, 2018
1/23/18

« fin »

über java.time

Die java.time Rahmen in Java 8 gebaut und später. Diese Klassen verdrängen die lästigen alten Vermächtnis Datum Zeitklassen wie java.util.Date , Calendar & SimpleDateFormat .

Die Joda-Time Projekt jetzt in Wartungsmodus , rät Migration auf die java.time Klassen.

Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und Stack-Überlauf suchen viele Beispiele und Erklärungen. Spezifikation JSR 310 .

können Sie tauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie einen JDBC-Treiber kompatibel mit JDBC 4.2 oder höher. Keine Notwendigkeit für Streicher, keine Notwendigkeit für java.sql.* Klassen.

Wo die java.time Klassen erhalten?

Das ThreeTen-Extra Projekt erstreckt java.time mit zusätzliche Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time. Sie können einige nützliche Klassen hier wie Interval YearWeek , YearQuarter und mehr .

Lokalisierung von Datum string:

Basierend auf redsonic der Post:

private String localizeDate(String inputdate, Locale locale) { 

    Date date = new Date();
    SimpleDateFormat dateFormatCN = new SimpleDateFormat("dd-MMM-yyyy", locale);       
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy");


    try {
        date = dateFormat.parse(inputdate);
    } catch (ParseException e) {
        log.warn("Input date was not correct. Can not localize it.");
        return inputdate;
    }
    return dateFormatCN.format(date);
}

String localizedDate = localizeDate("05-Sep-2013", new Locale("zh","CN"));

wird wie 05- 九月 -2013

Dies zeigt das Datum entsprechend des Benutzers aktuelle locale :

Zur Rückkehr Datum und Uhrzeit:

import java.text.DateFormat;    
import java.util.Date;

Date date = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
String myDate = df.format(date);

31. Dezember 1969 07.00.02

Um das Rückreisedatum nur, zu verwenden:

DateFormat.getDateInstance() 

31. Dezember 1969

String text = new SimpleDateFormat("E, MMM d, yyyy").format(date);

Java 8 Stil für ein bestimmtes Datum

LocalDate today = LocalDate.of(1982, Month.AUGUST, 31);
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.ENGLISH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.FRENCH)));
System.out.println(today.format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.JAPANESE)));

Java8

 import java.time.format.DateTimeFormatter;         
 myDate.format(DateTimeFormatter.ofPattern("dd-MMM-YYYY",new Locale("ar")))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top