2017-02-16 29 views
4

В рамках интернационализации, есть требование, чтобы поддержать немногие страны какКак использовать неподдерживаемый языковой стандарт в Java

Антигуа и Барбуда - ISO3166 код - AG & Доминиканская Республика - ISO3166 код - DO

Locale loc = new Locale("en", "AG"); 
    DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, loc); 
    System.out.println("Short format: " + df1.format(new Date())); 

Java отобразит дату в формате mm/dd/yy, где формат даты в этих странах равен dd/mm/yy.

Есть ли способ, которым мы можем достичь образца dd/mm/yy? Даже библиотеки ICU4J также не поддерживают эти страны?

Заранее спасибо

+1

Возможно, вам придется создать свой собственный «DateFormat» с правильной компоновкой. –

+0

Тогда это похоже на жесткое кодирование. Я ищу вариант для обеспечения подхода на основе XML, который может передавать шаблон даты/валюты/номера для разных стран. –

ответ

5

Вы можете добавить дополнительные локали в среду выполнения Java, создавая расширение на основе интерфейс поставщика услуг соответствующих (SPI).

Например, если вы хотите, чтобы указать короткий формат даты для Антигуа и Барбуда (en_AG), вы можете реализовать java.text.spi.DateFormatProvider SPI следующим образом:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.text.spi.DateFormatProvider; 
import java.util.Locale; 

public class EnAgDateFormatProvider extends DateFormatProvider { 
    private static final Locale EN_AG_LOCALE = new Locale("en", "AG"); 

    public DateFormat getDateInstance(int style, Locale locale) { 
     // if your extension supports multiple locales, you have to take the locale 
     // parameter into account as well 
     switch (style) { 
      case DateFormat.SHORT: 
       return new SimpleDateFormat("dd/MM/yy"); 

      default: 
       // TODO implement other styles 
       return null; 
     } 
    } 

    public DateFormat getTimeInstance(int style, Locale locale) { 
     // TODO implement this method 
     return null; 
    } 

    public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, 
      Locale locale) { 

     // TODO implement this method 
     return null; 
    } 

    public Locale[] getAvailableLocales() { 
     return new Locale[]{EN_AG_LOCALE}; 
    } 
} 

Это должны быть упакованы в файл JAR , а в каталоге META-INF/services JAR вам нужно будет создать файл с именем java.text.spi.DateFormatProvider. Этот файл должен содержать полное имя поставщика, в моем случае просто:

EnAgDateFormatProvider 

После того, как вы создали файл JAR, вам нужно бросить его в каталоге расширений вашего JRE. На моей машине Ubuntu это /usr/lib/jvm/java-8-oracle/jre/lib/ext/.

После этого фрагмент кода из вашего вопроса:

Locale loc = new Locale("en", "AG"); 
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, loc); 
System.out.println("Short format: " + df1.format(new Date())); 

напечатает:

Short format: 16/02/2017 

Ссылки:

+0

Предположим, что код в формате Date находится в классе DateTest.java. Если мы вызываем java -Djava.locale.providers = CLDR DateTest, он не печатает формат даты от поставщика пользовательских услуг (т. Е. Dd/MM/yy), а вместо этого печатает из шаблона CLDR –

1

Вы используете хлопотно старые классы даты и времени, теперь наследство, вытесняли классами java.time.

Антигуа и Барбуда

«Антигуа и Барбуда - ISO3166 код - AG» является не поддерживается локаль в Java 8. См list of supported locales или позвоните по телефону:

System.out.println ("locales: " + Arrays.toString (Locale.getAvailableLocales())); 

Вы можете создать свой собственный список явных шаблонов форматирования для таких неподдерживаемых локалей. Например, DateTimeFormatter.ofPattern("dd/MM/yy").

Еще не определено, определите Map каждого неопределенного языкового стандарта, используя строку языка страны, такую ​​как «en-AG», с аналогичным определенным Locale, который использует те же подходящие форматы.

Или определите Enum для каждой неопределенной локали методами, которые возвращают DateTimeFormatter объектов для каждой длины (ПОЛНЫЙ, КОРОТКИЙ и т. Д.).

Или рассмотрите Answer by Comelissen, хотя я еще не изучил это достаточно хорошо, чтобы порекомендовать его еще.

Доминиканская Республика

«Доминиканская Республика - ISO3166 код - DO» это поддерживается в Java 8.

Locale locale = new Locale ("es" , "DO"); // Spanish in Dominican Republic. 
LocalDate localDate = LocalDate.now (ZoneId.of ("Europe/Paris")); 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate (FormatStyle.SHORT).withLocale (locale); 
String output = localDate.format (f); 

System.out.println ("localDate: " + localDate + " is " + output); 

LocalDate: 2017-02-16 составляет 16/02/17

Результат такой, как вы пожелали, dd/MM/yy.


О java.time

java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter и more.