首页 > 解决方案 > 如何在 java.text.DateFormat 中使用不受支持的语言环境

问题描述

我正在尝试获取巴基斯坦语言环境“en_PK”的日期格式,即“dd/MM/yy”

Locale localePK = new Locale("en", "PK");
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, localePK);

上面的代码片段返回“MM/dd/yy”

但是该语言环境似乎不受支持,并且在DateFormat.getAvailableLocales()列表中不可用。

请提出解决此问题的理想方法。提前致谢。

标签: javadatelocaledate-format

解决方案


Locale在导航时使用该对象搜索国家名称,DateFormat.getAvailableLocales()并在找到它后中断循环。

import java.text.DateFormat;
import java.time.LocalDate;
import java.time.chrono.IsoChronology;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.FormatStyle;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Locale localePk = null;
        for (Locale locale : DateFormat.getAvailableLocales()) {
            if (locale.getDisplayCountry().equals("Pakistan")) {
                localePk = locale;
                break;
            }
        }
        if (localePk != null) {
            String datePattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null,
                    IsoChronology.INSTANCE, localePk);
            System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern(datePattern, localePk)));
        }
    }
}

输出:

10/10/2020

请注意,这DateTimeFormatterBuilder现代日期时间 API 的一部分。

如果您正在为您的 Android 项目执行此操作,并且您的 Android API 级别仍然不符合 Java-8,请通过 desugaring和How to use ThreeTenABP in Android Project检查Java 8+ APIs available

java.util日期时间类已过时且容易出错,它们的格式化 API 也是如此,DateFormat. 但是,如果您仍在寻找使用这些旧版 API 的解决方案,以下是其中之一:

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Locale localePk = null;
        for (Locale locale : DateFormat.getAvailableLocales()) {
            if (locale.getDisplayCountry().equals("Pakistan")) {
                localePk = locale;
                break;
            }
        }
        if (localePk != null) {
            DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, localePk);
            System.out.println(df.format(new Date()));
        }
    }
}

输出:

10/10/2020

推荐阅读