为什么java.text.DateFormat在Android上为en_US和en_GB返回相同的date格式?

我有一个小的Android应用程序,我正在使用基于区域设置以不同的格式打印特定的date

这里是我的代码(使用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根据用户的当前语言环境和date顺序设置获得正确的结果,但是这并不能解释为什么使用java.text.DateFormat获取以编程方式指定的语言环境的格式不会返回正确的结果。

另外,它不仅仅是SHORTdate格式 – MEDIUMLONG显示了Android和Java SE之间的不一致(即,Android为我指定的所有5个区域设置返回相同的格式)。

我已经在3个不同的设备(2.3和4.0)和仿真器(2.3和4.0)上testing过了,结果都一样。 我也testing了使用Locale.USLocale.UK只是为了看看他们是不同的,但结果是一样的。

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

更新:2012-07-18

看起来这是仿真器的问题,以及在美国制造的许多设备。 使用Dalvik资源pipe理器:

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

我已经能够看到系统在不同的设备(包括模拟器)上返回的en_GB。 有些返回适当的格式,有些返回en_US格式。 我认为这只是一个问题,即每个设备的操作系统内置什么样的格式资源,尽pipe模拟器返回的格式和美国制造的许多设备一样,我想知道英国开发人员的想法,已经看到了这个问题。

Solutions Collecting From Web of "为什么java.text.DateFormat在Android上为en_US和en_GB返回相同的date格式?"

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

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

我不得不求助于用户selectdate格式作为首选项。 不太好。

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

在这里输入图像说明

尝试这个:

  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));