7

Potrzebuję wyodrębnić tylko informacje o miesiącu i roku z Data Java, aby wyświetlić w GUI. Ta data musi być przetłumaczona przy użyciu lokalizacji użytkownika. znam 2 sposoby formatowania zlokalizowanych terminach:Jak wyodrębnić pola dat dla formatowania specyficznego dla ustawień regionalnych w Javie?

  1. Korzystanie DateFormat.getInstance(DateFormat.LONG, locale).format(date)
  2. Korzystanie new SimpleDateFormat("yyyy M", locale).format(date)

Dla lokalizacji SIMPLIFIED_CHINESE i daty 2013-02-18, to daje:

  1. 2013 年 2 月 18日

Musimy użyć formatu LONG bez dnia (2013 年 2 月). [Wariant 2 jest oczywiście nie do zaakceptowania, ponieważ ustawienie regionalne nie ma wpływu na lokalizację). Problem może być następujący: jak usunąć część dnia (18 日) z długiego formatu? Próbowałem użyć metody format(Date date, StringBuffer toAppendTo, FieldPosition pos), ale pozwala to tylko na wyodrębnienie części numeru, a nie dodatkowego znaku.

Wzór DateFormat.getInstance(DateFormat.LONG, Locale.SIMPLIFIED_CHINESE) to yyyy'年'M'月'd'日'. Wyodrębnienie części dnia dałoby yyyy'年'M'月'. Wydaje mi się, że nie można używać standardu Java DataFormat, aby to osiągnąć, ponieważ dodatkowe znaki (, i ) nie są mapowane do odpowiedniego pola, ale są po prostu znakami bez innych znaczników semantycznych dla formatera.

Spojrzałem na DateFormatSymbols i LocaleServiceProvider, ale myślę, że to nie pomaga. Dla mnie punktem rozszerzenia byłoby dodanie innego stylu daty do metody getInstance(int style). Ale nie wydaje się to możliwe bez implementacji dla wszystkich ustawień regionalnych ...

Czy ta analiza jest prawidłowa? Jak osiągnąć to formatowanie w czysty sposób?

+0

+1: Nie widzę sposobu, aby to zrobić. Może spróbuj zamiast tego biblioteki JodaTime. –

+0

Próbowałem bez powodzenia następujących rzeczy: 'YearMonth.fromCalendarFields (cal) .toString (DateTimeFormat.longDate(). WithLocale (locale))'. – Jidehem

Odpowiedz

1

Nie sądzę, aby istniały jakiekolwiek predefiniowane stałe dla formatowania rok-miesiąc w ustawieniach regionalnych zh-CN, więc musisz go sformatować.

new SimpleDateFormat("yyyy年M月").format(date) 

Jak SimpleDateFormat mówi (podkreślone przeze mnie):

Formaty daty i godziny podane są według daty i czasu ciągów sygnatur. W ciągu łańcuchów wzorca daty i czasu, niecytowane litery od "A" do "Z" i od "a" do "z" są interpretowane jako litery wzoru reprezentujące składniki ciągu daty lub czasu. Tekst można cytować za pomocą pojedynczych cudzysłowów ('), aby uniknąć interpretacji. "" "reprezentuje pojedynczy cytat. Wszystkie pozostałe znaki nie są interpretowane; są one po prostu kopiowane do ciągu wyjściowego podczas formatowania lub dopasowywane względem łańcucha wejściowego podczas analizowania.

W ten sposób bezpieczne jest umieszczanie chińskich znaków w ciągu znaków.

Ponieważ Java jest w kodzie Unicode, można wstawiać znaki w źródle, o ile kompiluje się z zestawem znaków źródłowych Unicode.W przeciwnym razie należy przeczytać ten ciąg na zewnątrz, np. z jakiegoś pliku lub bazy danych Unicode.

+0

W skrócie, Java nie zapewnia sposobu na internacjonalizację takich formatów. Musi być zaimplementowany ręcznie. – Jidehem

+0

Tak, to specjalny format daty. Gdyby istniał typ danych podobny do DateTime, który reprezentowałby tylko miesiąc i rok, mielibyśmy większe szanse na posiadanie wbudowanego wsparcia. To nie jest tak powszechne, więc musisz tego użyć. Typy danych IMHO typu DateTime są tak skomplikowanym tematem, że nie warto go komplikować. – gaborsch

+0

Innym sposobem na uniknięcie problemów z kodowaniem jest odzyskanie przetłumaczonej wartości stylu LONG i hardcode, która część wzoru daty zachowuje wzór (w naszym przypadku, odrzuć 4 ostatnie znaki wzorca). To daje: > final String patternFull = ((SimpleDateFormat) DateFormat.getDateInstance (DateFormat.LONG, Locale.SIMPLIFIED_CHINESE)). ToPattern(); final Wzór StringYearMonth = patternFull.substring (0, patternFull.length() - 4); – Jidehem

Powiązane problemy