Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我需要获得基于countryCode的本地化日期格式。但美国返回dd/MM/yyyy_Android_Date_Locale_Simpledateformat_Date Format - Fatal编程技术网

Android 我需要获得基于countryCode的本地化日期格式。但美国返回dd/MM/yyyy

Android 我需要获得基于countryCode的本地化日期格式。但美国返回dd/MM/yyyy,android,date,locale,simpledateformat,date-format,Android,Date,Locale,Simpledateformat,Date Format,这是我的代码: try { Locale loc = new Locale("", countryCode); DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, loc); String pattern = ((SimpleDateFormat) formatter).toPattern(); format = pattern;

这是我的代码:

   try {
        Locale loc = new Locale("", countryCode);
        DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, loc);
        String pattern = ((SimpleDateFormat) formatter).toPattern();
        format = pattern;
        if (!format.contains("yyyy"))
            format = format.replace("y", "yyyy");
    } catch (Exception e) {
        Log.e("date", "Error trying to get date from Locale:" + e.getMessage());
    }
现在我确实根据国家代码设置了区域设置。 它确实让我回到“我们”的显示国家名称为“美国”,所以我知道地区是正确的。 但是区域设置返回“dd/MM/y”为什么

编辑 我需要将我的最小API设置为22。所以我不能使用Java8函数: 校准数据的日期时间格式(dateStyle) 因为它要求最低26

此外,我需要基于我发送的国家代码的本地化日期格式。 我有一个国家列表,用户选择一个,我需要显示它的时间和日期格式

为了提供更多上下文,我加载了一个包含以下内容的列表:

  private void createCountriesHashmap() {
    for (String iso : Locale.getISOCountries()) {
        Locale l = new Locale("", iso);
        map.put(l.getDisplayCountry(), iso);
        if (l.getDisplayCountry().trim().length() > 0 && !countries.contains(l.getDisplayCountry())) {
            countries.add(l.getDisplayCountry());
        }
    }
    Collections.sort(countries);
}
当我从那里选择一个对象时,我会得到它的国家代码。我使用国家代码创建区域设置:
locale loc=new locale(“,countryCode”)

我需要那个国家的日期格式。不是我的国家

我也遇到了同样的问题,我解决了这个问题(是kotlin,但您可以轻松地将其转换为java):


它根据设备区域返回dd/MM/yyyy或MM/dd/yyyy。

感谢@MenoHochschild的评论。我确实做到了这一点:

   Locale loc = new Locale("", countryCode);
        Locale[] locales = java.text.DateFormat.getAvailableLocales();
        for (Locale locale : locales) {
            if (locale.getCountry().contains(countryCode)) {
                loc = locale;
                break;
            }
        }
        DateFormat formatter = DateFormat.getDateInstance(DateFormat.SHORT, loc);
        String pattern = ((SimpleDateFormat) formatter).toPattern();

目前还不清楚本地化日期格式是与语言还是与国家有关。在我看来,这似乎最常与语言或两者的结合有关。因此,当您要求在没有语言的地区(仅限国家/地区)使用短日期格式时,通常会得到
y-MM-dd
,这是全球默认的短日期格式

My Java 11在美国有6(六)个可用的区域设置,它们倾向于提供不同的短日期格式:

  • lkt_US
    (一种苏族语言)给出
    y-MM-dd
    (全球默认值)
  • es_US
    (西班牙语)和
    haw_US
    ()给出
    d/M/yy
  • en_US_POSIX
    en_US
    chr_US
    ()给出
    M/d/yy
因此,我认为以上所有内容都是简短的美国日期格式的正确答案。我相信你自己答案中的密码会给你其中一个。真正的问题是你想要哪一个。或者你的用户

java.time和ThreeTenABP 现在我正在写一个答案,我想提到
DateFormat
SimpleDateFormat
是出了名的麻烦和过时。取而代之的是考虑使用<代码> DateTimeFormatter < /COD>和/或<代码> DateTimeFormatterBuilder <代码>,从javaTime-现代java日期和时间API .< /p>
    Locale usSpanish = Locale.forLanguageTag("es-US");
    String dateFormatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
            FormatStyle.SHORT, null, IsoChronology.INSTANCE, usSpanish);
    System.out.println("Format pattern: " + dateFormatPattern);
格式样式:M/d/yy

我已经在Java7上使用ThreeTen Backport(Java.time的Backport)运行了这个代码段。格式模式与我从上面的Java11中得到的不同。Java7使用Java的内置语言环境数据,而Java11使用CLDR(Unicode公共语言环境数据存储库)。两者之间存在差异。我不知道安卓使用的是什么,但我相信这是明智的

问题:我可以在Android上使用java.time吗? 是的,java.time在较旧和较新的Android设备上运行良好。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在Java6和Java7中,获取三个后端口,即现代类的后端口(三个十用于JSR310;参见底部的链接)
  • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
    org.threeten.bp
    导入日期和时间类
链接
  • 解释如何使用java.time
  • ,其中首先描述了
    java.time
  • ,java.time的后端口
到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

  • 我需要基于区域设置的本地化日期。不是我的locale变量“countryCode”的确切内容是什么?你为什么不简单地使用
    Locale.US
    (或者至少是为了验证)?我的国家代码是“US”?嗯,我调试了它,它给了我一个区域设置“_US”,显示名称是“US”。我使用相同的逻辑在选择器中创建和显示国家,使用此逻辑,所有显示名称都是正确的。我假设区域设置也正确启动了,不是吗?好的,那么通过调用
    java.text.DateFormat.getAvailableLocales()
    ?@MenoHochschild抱歉,我不理解您最近的问题。我现在编辑了我的评论。请检查。从
    java.text.DateFormat.getAvailableCales()
    中列出的语言环境开始,这是更好的方法,该语言环境也是定义的,而不仅仅是国家。然后,您可以从本地化日期格式支持的区域设置中提取国家/地区。仅供参考,使用
    java.time
    意味着对区域设置的处理是相同的。我接受了这个答案,因为它编写得很好,并且有文档记录。感谢您的深入概述。
        Locale usSpanish = Locale.forLanguageTag("es-US");
        String dateFormatPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
                FormatStyle.SHORT, null, IsoChronology.INSTANCE, usSpanish);
        System.out.println("Format pattern: " + dateFormatPattern);