2012-04-27 9 views
10

Mam małą aplikację na Androida, której używam do drukowania określonej daty w różnych formatach na podstawie ustawień regionalnych.Dlaczego java.text.DateFormat zwraca ten sam format daty dla en_US i en_GB w systemie Android?

Tu jest mój kod (używając java.text.DateFormat):

Locale[] locales = {new Locale("en", "US"), new Locale("en", "GB"), new Locale("en", "AU"), new Locale("en", "NZ"), new Locale("en", "ZA")}; 
for(int i = 0; i < locales.length; ++i) { 
    Log.d(logKey, locales[i].toString() + " - " + DateFormat.getDateInstance(DateFormat.SHORT, locales[i]).format(Calendar.getInstance().getTime())); 
} 

wyjście z tego w ten sposób LogCat:

D/FormatPoC( 390): en_US - 4/27/12 
D/FormatPoC( 390): en_GB - 4/27/12 
D/FormatPoC( 390): en_AU - 4/27/12 
D/FormatPoC( 390): en_NZ - 4/27/12 
D/FormatPoC( 390): en_ZA - 4/27/12 

Więc moje pytanie brzmi - dlaczego to wszystko to samo? W języku Java SE otrzymuję:

en_US - 4/27/12 
en_GB - 27/04/12 
en_AU - 27/04/12 
en_NZ - 27/04/12 
en_ZA - 2012/04/27 

Tego właśnie można się spodziewać. Wiem, że mogę użyć android.text.format.DateFormat, aby uzyskać poprawne wyniki w oparciu o bieżące ustawienia lokalizacji i daty w danym użytkowniku, ale to nie wyjaśnia, dlaczego użycie formatu java.text.DateFormat w celu uzyskania formatu dla programowo określonego ustawienia nie zwróci prawidłowych wyników.

Dodatkowo, nie jest to tylko format SHORT data - MEDIUM i LONG pokaż niespójności między Android i Java SE, jak również (tj Android zwraca ten sam format dla wszystkich 5 Locales I określono).

Przetestowałem to na 3 różnych urządzeniach (2.3 i 4.0) oraz na emulatorze (2.3 i 4.0), wszystkie z tymi samymi wynikami. Przetestowałem również przy użyciu Locale.US i Locale.UK tylko po to, aby zobaczyć, czy są one w jakiś sposób różne, ale wyniki są takie same.

Czy ktoś inny się na to natknął, czy wie, dlaczego tak się stało?

UPDATE: 2012-07-18

Wydaje się, że jest to problem z emulatora, jak również wiele urządzeń produkowane w USA. Korzystanie Dalvik Explorer:

https://play.google.com/store/apps/details?id=org.jessies.dalvikexplorer&hl=en

byłem w stanie zobaczyć, co system powróci do en_GB na różnych urządzeniach (w tym emulatora). Niektóre zwracają odpowiednie formaty, niektóre zwracają format en_US. Zakładam, że jest to po prostu kwestia tego, jakie zasoby formatowania są wbudowane w system operacyjny dla każdego urządzenia, chociaż to, że emulator zwraca złe formaty, a także wiele moich urządzeń wyprodukowanych w Stanach Zjednoczonych, zastanawiam się, co sądzą brytyjscy deweloperzy, lub jeśli widzieli ten problem.

Odpowiedz

1

spróbuj tego:

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); 
    Log.d("Locale.UK","Locale.UK - "+df.format(date)); 
    System.out.println("United Kingdom: " + df.format(date)); 
    df = DateFormat.getDateInstance(style, Locale.US); 
    Log.d("Locale.US","Locale.US - "+df.format(date)); 
    df = DateFormat.getDateInstance(style, Locale.FRANCE); 
    Log.d("Locale.FRANCE","Locale.FRANCE - "+df.format(date)); 
    df = DateFormat.getDateInstance(style, Locale.ITALY); 
    Log.d("Locale.ITALY","Locale.ITALY - "+df.format(date)); 
    df = DateFormat.getDateInstance(style, Locale.JAPAN); 
    Log.d("Locale.JAPAN","Locale.JAPAN - "+df.format(date)); 
+0

Choć to dość dużo dokładnie to, co robię (z dodatkiem innych lokalizacjach), dałem mu strzał. Formaty w USA i Wielkiej Brytanii są takie same: "27 kwietnia 2012 r.". Spodziewałbym się, że brytyjski będzie "27 kwietnia 2012 roku". Pozostałe wydają się ważne, chociaż nie jestem ani Francuzem, ani Włochem, ani Japończykiem, więc nie jestem w 100% pewny. ;-) – mWillis

+0

, ale jeśli uzyskujesz właściwy wynik, przeprowadź lokalizowanie jako 'Locale.ITALY' zamiast nowego Locale (" en "," GB "). –

+0

Jak stwierdziłem w pytaniu, użyłem zarówno 'Locale.UK' i' new Locale ("en", "GB") '- są one takie same i zwracają niewłaściwy format. 'Locale.ITALY' nie wchodzi w zakres tego, co próbuję określić. – mWillis

4

To nie jest odpowiedź (nie mam jeszcze wystarczająco dużo rep, aby dodać komentarz ...)

Jako deweloper brytyjskiego Mam natknąć się tym problemem. Widzę ten problem z moją Galaxy S3, dokładnie tak, jak to opisałeś.

Muszę uciec się do umożliwienia użytkownikowi wyboru formatu daty jako preferencji. Niezbyt dobrze.

Program DalvikExplorer pokazuje również problem:

enter image description here

+0

Dziękujemy za informację zwrotną! To dziwny problem, ponieważ widziałem inne urządzenia, które zwracają odpowiednie formatowanie dla en_GB. – mWillis

+0

Tak, rzeczywiście. Próbowałem również z HTC Desire i to działa dobrze. –

Powiązane problemy