10

我有一个小型 Android 应用程序,用于根据区域设置以不同格式打印特定日期。

这是我的代码(使用java.text.DateFormat):

Locale[] locales = {new Locale("en", "US"), new Locale("en", "GB"), new Locale("en", "AU"), new Locale("en", "NZ"), new Locale("en", "ZA")};
for(int i = 0; i < locales.length; ++i) {
    Log.d(logKey, locales[i].toString() + " - " + DateFormat.getDateInstance(DateFormat.SHORT, locales[i]).format(Calendar.getInstance().getTime()));
}

因此,LogCat 中的输出为:

D/FormatPoC(  390): en_US - 4/27/12
D/FormatPoC(  390): en_GB - 4/27/12
D/FormatPoC(  390): en_AU - 4/27/12
D/FormatPoC(  390): en_NZ - 4/27/12
D/FormatPoC(  390): en_ZA - 4/27/12

所以我的问题是——为什么所有这些都是一样的?在 Java SE 中,我得到:

en_US - 4/27/12
en_GB - 27/04/12
en_AU - 27/04/12
en_NZ - 27/04/12
en_ZA - 2012/04/27

这是我所期望的。我知道我可以android.text.format.DateFormat根据用户的当前语言环境和日期顺序设置来获得正确的结果,但这并不能解释为什么使用java.text.DateFormat获取以编程方式指定的语言环境的格式不会返回正确的结果。

此外,它不仅仅是SHORT日期格式 -MEDIUM并且还LONG显示了 Android 和 Java SE 之间的不一致(即,Android 对我指定的所有 5 个区域设置返回相同的格式)。

我已经在 3 种不同的设备(2.3 和 4.0)和模拟器(2.3 和 4.0)上对其进行了测试,结果都相同。我还测试了使用Locale.USandLocale.UK只是为了看看它们是否有所不同,但结果是一样的。

有没有其他人遇到过这个,或者知道为什么会这样?

更新:2012-07-18

这似乎是模拟器以及美国制造的许多设备的问题。使用 Dalvik 资源管理器:

https://play.google.com/store/apps/details?id=org.jessies.dalvikexplorer&hl=en

我已经能够看到系统在不同设备(包括模拟器)上为 en_GB 返回了什么。有些返回适当的格式,有些返回 en_US 格式。我认为这只是每个设备的操作系统中内置了哪些格式资源的问题,尽管模拟器返回错误的格式以及我的许多美国制造的设备,我想知道英国开发人员的想法,或者他们是否见过这个问题。

4

2 回答 2

4

这不是答案(我还没有足够的代表来添加评论......)

作为一名英国开发人员,我遇到了这个问题。正如您所描述的,我在 Galaxy S3 上看到了这个问题。

我不得不求助于允许用户选择日期格式作为首选项。不是很好。

DalvikExplorer 程序也显示了这个问题:

在此处输入图像描述

于 2012-08-01T15:06:11.483 回答
1

尝试这个:

    int style = DateFormat.MEDIUM;
    //Also try with style = DateFormat.FULL and DateFormat.SHORT
    Date date = new Date();
    DateFormat df;
    df = DateFormat.getDateInstance(style, Locale.UK);
    Log.d("Locale.UK","Locale.UK - "+df.format(date));
    System.out.println("United Kingdom: " + df.format(date));
    df = DateFormat.getDateInstance(style, Locale.US);
    Log.d("Locale.US","Locale.US - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.FRANCE);
    Log.d("Locale.FRANCE","Locale.FRANCE - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.ITALY);
    Log.d("Locale.ITALY","Locale.ITALY - "+df.format(date));
    df = DateFormat.getDateInstance(style, Locale.JAPAN);
    Log.d("Locale.JAPAN","Locale.JAPAN - "+df.format(date));
于 2012-04-27T18:28:35.477 回答