6

作为国际化的一部分,要求支持少数国家,例如

安提瓜和巴布达 - 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 库也不支持那些国家?

提前致谢

4

2 回答 2

7

您可以通过基于适当的服务提供者接口 (SPI) 创建扩展来向 Java 运行时添加其他语言环境。

例如,如果您想为安提瓜和巴布达 (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/servicesJAR 的目录中,您需要创建一个名为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

参考:

于 2017-02-16T07:56:00.217 回答
3
于 2017-02-16T08:24:43.277 回答