it-swarm.com.de

Datumsformatierung basierend auf dem Benutzergebietsschema auf Android

Ich möchte ein Geburtsdatum basierend auf dem Gebietsschema des Benutzers anzeigen. In meiner Bewerbung ist eines meiner Felder das Geburtsdatum, das derzeit im Format dd/mm/yyyy vorliegt. Wenn der Benutzer sein Gebietsschema ändert, sollte sich auch das Datumsformat entsprechend ändern. Zeiger oder Codebeispiele würden mir wirklich helfen, das Problem zu überwinden.

44
shailbenq

Sie können die DateFormat -Klasse verwenden, die ein Datum gemäß dem Benutzergebietsschema formatiert.

Beispiel:

String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
    date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
    // handle exception here !
}
Java.text.DateFormat dateFormat = Android.text.format.DateFormat.getDateFormat(context);
String s = dateFormat.format(date);

Sie können die verschiedenen Methoden getLongDateFormat, getMediumDateFormat verwenden, abhängig von der gewünschten Ausführlichkeitsstufe.

77
Super Chafouin

Um das Datumsformat entsprechend dem Gebietsschema zu ändern, funktionierte der folgende Code für mich:

    String dateOfBirth = "26/02/1974";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date date = null;
    try {
        date = sdf.parse(dateOfBirth);
    } catch (ParseException e) {
        // handle exception here !
    }

    String myString = DateFormat.getDateInstance(DateFormat.SHORT).format(date);

Wenn Sie das Gebietsschema ändern, ändert sich das Datumsformat danach. Weitere Informationen zu den Datumsmustern: http://docs.Oracle.com/javase/tutorial/i18n/format/ dateFormat.html

12

Android-API bietet eine einfache Möglichkeit, das lokalisierte Datumsformat anzuzeigen. Der folgende Code funktioniert. 

public class FileDateUtil {
    public static String getModifiedDate(long modified) {
        return getModifiedDate(Locale.getDefault(), modified);
    }

    public static String getModifiedDate(Locale locale, long modified) {
        SimpleDateFormat dateFormat = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            dateFormat = new SimpleDateFormat(getDateFormat(locale));
        } else {
            dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa");
        }

        return dateFormat.format(new Date(modified));
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getDateFormat(Locale locale) {
        return DateFormat.getBestDateTimePattern(locale, "MM/dd/yyyy hh:mm:ss aa");
    }
}

Sie können folgenden Code überprüfen.

String koreaData = FileDateUtil.getModifiedDate(Locale.KOREA, System.currentTimeMillis());
String franceData = FileDateUtil.getModifiedDate(Locale.FRENCH, System.currentTimeMillis());
String defaultData = FileDateUtil.getModifiedDate(Locale.getDefault(), System.currentTimeMillis());

String result = "Korea : " + koreaData + System.getProperty("line.separator");
result += "France : " + franceData + System.getProperty("line.separator");
result += "Default : " + defaultData + System.getProperty("line.separator"); 
tv.setText(result);
9
Justin Song

So einfach wie 

Für Datum + Uhrzeit:

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());

Für nur Datum:

DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
7
David_E

Während die akzeptierte Antwort beim Stellen der Frage richtig war, ist sie später veraltet. Ich trage die moderne Antwort bei.

Java.time und ThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);

    LocalDate dateOfBirth = LocalDate.of(1991, Month.OCTOBER, 13);
    String formattedDob = dateOfBirth.format(dateFormatter);
    System.out.println("Born: " + formattedDob);

Je nach Gebietsschemaeinstellung der JVM (normalerweise vom Gerät) werden unterschiedliche Ausgaben ausgegeben. Zum Beispiel:

  • Kanadisches Französisch: Born: 91-10-13
  • Chinesisch: Born: 1991/10/13
  • Deutsch: Born: 13.10.91
  • Italienisch: Born: 13/10/91

Wenn Sie ein längeres Format wünschen, können Sie einen anderen Formatstil angeben. Beispielausgaben im US-englischen Gebietsschema:

  • FormatStyle.SHORT: Born: 10/13/91
  • FormatStyle.MEDIUM: Born: Oct 13, 1991
  • FormatStyle.LONG: Born: October 13, 1991
  • FormatStyle.FULL: Born: Thursday, October 13, 1991

Frage: Kann ich Java.time unter Android verwenden?

Ja, Java.time funktioniert gut auf älteren und neueren Geräten Android). Es wird nur mindestens Java 6 benötigt.

  • In Java 8 und höher und auf neueren Android Geräten (ab API-Level 26)) ist die moderne API integriert.
  • In Java 6 und 7 erhalten Sie den ThreeTen Backport, den Backport der modernen Klassen (ThreeTen für JSR 310; siehe die Links unten).
  • Bei (älteren) Android verwenden Sie die Android= Edition von ThreeTen Backport. Sie heißt ThreeTenABP. Und stellen Sie sicher, dass Sie die Datums- und Zeitklassen aus org.threeten.bp mit Unterpaketen.

Frage: Kann ich auch Benutzereingaben im lokalen Format des Benutzers akzeptieren?

Ja, du kannst. Der Formatierer kann auch zum Parsen einer Zeichenfolge vom Benutzer in ein LocalDate verwendet werden:

    LocalDate date = LocalDate.parse(userInputString, dateFormatter);

Ich schlage vor, dass Sie zuerst ein Beispieldatum formatieren und es dem Benutzer anzeigen, damit er sehen kann, welches Format Ihr Programm für sein Gebietsschema erwartet. Nehmen Sie als Beispieldatum ein Datum mit einem Tag des Monats größer als 12 und einem Jahr größer als 31, damit die Reihenfolge von Tag, Monat und Jahr im Beispiel angezeigt wird (bei längeren Formaten spielt das Jahr keine Rolle, da es vierstellig ist ).

Beim Parsen wird ein DateTimeParseException ausgegeben, wenn der Benutzer das Datum in einem falschen Format oder einem ungültigen Datum eingegeben hat. Fangen Sie es ab und erlauben Sie dem Benutzer, es erneut zu versuchen.

Frage: Kann ich das auch mit einer Tageszeit machen? Ein Datum und eine Uhrzeit?

Ja. Zum Formatieren einer Uhrzeit gemäß dem Gebietsschema eines Benutzers benötigen Sie einen Formatierer von DateTimeFormatter.ofLocalizedTime. Verwenden Sie für Datum und Uhrzeit zusammen eine der überladenen Versionen von DateTimeFormatter.ofLocalizedDateTime.

Vermeiden Sie die Klassen DateFormat, SImpleDateFormat und Date

Ich empfehle, DateFormat, SimpleDateFormat und Date nicht zu verwenden. Diese Klassen sind schlecht gestaltet und längst überholt, wobei die ersten beiden besonders berüchtigt sind. Verwenden Sie stattdessen LocalDate, DateTimeFormatter und andere Klassen aus Java.time, der modernen API Java Datum und Uhrzeit).

Links

2
Ole V.V.

Um das Datumsformatmuster zu erhalten, können Sie Folgendes tun:

Format dateFormat = Android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();

Danach können Sie Ihre Eingabe nach dem Muster formatieren.

0
manish poddar