2017-09-03 101 views
5

To ćwiczenie pochodzi z książki Horstmann za Rdzeń Java dla niecierpliwych:Wyświetlacz czasu w Javie cyframi tajskich

napisać program, który pokazuje datę i czas stylów formatowania w [...] Tajlandii (z tajskimi cyframi).

Próbowałem rozwiązać exerciese z następującym fragmencie:

Locale locale = Locale.forLanguageTag("th-TH-TH"); 
    LocalDateTime dateTime = LocalDateTime.now(); 
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); 
    System.out.println(formatter.withLocale(locale).format(dateTime)); 

Problem polega na tym, że podczas gdy nazwa miesiąca jest prawidłowo podane w Tajlandii (przynajmniej tak mi się wydaje, bo nie wiedzieć Thai), cyfry są nadal formatowane cyframi arabskimi, a ich wynik jest następujący:

3 ก.ย. 2017, 22:42:16

Próbowałem różnych znaczników języka ("th-TH", "th-TH-TH", "th-TH-u-nu-thai") bezskutecznie. Co powinienem zmienić, aby program zachowywał się zgodnie z oczekiwaniami? Używam JDK 1.8.0_131 na Windows 10 64 bit.

+0

Dobre pytanie i odpowiedź. Ale FYI, ['LocalDateTime'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html) celowo odrzuca informacje o strefie czasowej. Lepiej używać ['ZonedDateTime'] (https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html) i zachować cenne informacje. Lepiej jawnie przekazać pożądaną/oczekiwaną strefę czasową do jednej z metod klasy '' .now (ZoneId) 'zamiast polegać niejawnie na bieżącej domyślnej strefie czasowej maszyny JVM, którą można zmienić w dowolnym momencie podczas wykonywania. –

+0

To jest przydatne pytanie i odpowiedź, ale wciąż mnie zastanawiasz, jak masz zamiar kiedykolwiek sprawdzić, czy kod jest poprawny, jeśli nie możesz zrozumieć wyników. :) – ajb

+0

@ajb Wyjście wygląda dla mnie przekonująco, nie-zachodnie :) – lukeg

Odpowiedz

4

DateTimeFormatter::withDecimalStyle

udało mi się rozwiązać ćwiczenia. Trzeba zdać DecimalStyle do formatyzatora wywołując DateTimeFormatter::withDecimalStyle, tak (patrz kod w pogrubioną zmian):

 

    Locale locale = Locale.forLanguageTag("th-TH-u-nu-thai"); 
    LocalDateTime dateTime = LocalDateTime.now(); 
    DecimalStyle style = DecimalStyle.of(locale); 
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);    
    System.out.println(formatter.withLocale(locale).withDecimalStyle(style).format(dateTime));