2016-07-23 9 views
3

Gibt es eine Möglichkeit, dateFormat-Elemente anzugeben und aktuelle Gebietsschemalregeln zu berücksichtigen? Ich weiß, dass ich SimpleDateFormat verwenden und das Format angeben kann, das ich mag - aber es kann in anderem Land falsch sein.Benutzerdefinierte Android-Datumsformatierung unter Berücksichtigung der aktuellen Ländereinstellung

Ich habe versucht, die Elemente in DateFormat zu maskieren, aber es nimmt nur kurze, mittlere und lange:

DateFormat dayMonth = DateFormat.getDateInstance(DateFormat.DAY_OF_WEEK_IN_MONTH_FIELD | DateFormat.MONTH_FIELD); 

Caused by: java.lang.IllegalArgumentException: Illegal date style: 11 
at java.text.DateFormat.checkDateStyle(DateFormat.java:843) 
at java.text.DateFormat.getDateInstance(DateFormat.java:378) 

ich will „Oktober 2016“ oder „Rij 2016“ erhalten. Dies kann implementiert werden mit:

DateFormat dayMonth = new SimpleDateFormat("MMM yyyy"); 

Aber ich möchte dieses Format in meiner App nicht hart codieren. Ich sehe nur einen Weg: Legen Sie es in strings.xml und ein Übersetzer muss es einrichten. Oder gibt es einen besseren Weg?

+0

Sie bei 'LocalDateTime' ausgesehen haben - vielleicht könnte dies som sein Alles was du suchst? Ein Beispiel wäre: 'LocalDateTime.parse (" 2016-07-22 ")' – ishmaelMakitla

+0

Interessante Klasse, aber die Formatmethode verwendet DateTimeFormatter als Argument - wir sind zurück bei meiner Frage. –

+0

Ich sehe, und was ist mit der 'DateTimeFormatter.ISO_LOCAL_DATE_TIME', ihre' Format' Methode dauert '' TemporalAccessor' - was 'LocalDateTime.parse (" 2016-07-22 ")' sein kann. – ishmaelMakitla

Antwort

2

Android hat DateFormat.getBestDateTimePattern() dieser

pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), "MMMyyyy"); 
dayMonth = new SimpleDateFormat(pattern); 

Der einzige Nachteil zu erreichen, ist die API-Ebene von 18. Ich persönlich das Ergebnis der DateFormat.getMediumDateFormat() als Ausweichlösung verwendet. Alternativ können Sie das Gebietsschema für ältere Geräte einfach ignorieren und new SimpleDateFormat("MMM yyyy") dort als Fallback verwenden oder versuchen, diese eine Methode zurück zu portieren.

OP bearbeitet

Ich habe versucht, auf Nexus 5-fach mit Android 6a folgendem Code

for (Locale locale : locales) { 
    format = android.text.format.DateFormat.getBestDateTimePattern(locale, "MMMyyyy"); 
    DateFormat dateFormat = new SimpleDateFormat(format, locale); 
    log.debug("{}: {}", locale.getCountry(), dateFormat.format(new Date())); 
} 

Und hier sind einige Ergebnisse:

  • NA: Juli 2016
  • AE : يوليو 2016
  • BG: 07.2016 г.
  • CZ: červenec 2016
  • FR: Goue 2016
  • DE: Juli 2016
  • GB: Juli 2016
  • FI: Heinä 2016
  • IT: Lui 2016
  • HR: SRP 2016.
  • RU: июль 2016
+0

Danke für diesen Hinweis. Ich habe deine Antwort mit meinen Ergebnissen aktualisiert. Die Ergebnisse sind für einige Länder nicht gut. –