以下DateFormat是否能够生成区域设置独立日期字符串

时间:2015-12-25 16:53:36

标签: java android

我的理想方式是使用以下代码

来设置与语言环境无关的日期字符串
DateFormat dateFormat = new SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH);

这意味着,如果我在阿拉伯语设备或美国设备中运行上述代码,则两者都会生成相同的字符串。

对于上述情况,dateFormat.format(date)将生成 2015年12月26日

我遇到了遗留代码,它使用以下方式生成与语言环境无关的日期字符串。

DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ENGLISH);

上述代码是否真的与区域设置无关。它会“错误地”生成像 2015年12月26日的字符串吗?

我写了一个简单的代码,在Windows和Android设备上进行测试。

for (Locale locale : Locale.getAvailableLocales()) {
    Locale.setDefault(locale);
    DateFormat dateFormat0 = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ENGLISH);
    DateFormat dateFormat1 = new SimpleDateFormat("MMM d, yyyy", Locale.ENGLISH);

    if (false == dateFormat0.format(date).equals(dateFormat1.format(date))) {
        throw new java.lang.RuntimeException("Opps");
    }
}

没有抛出异常。

我想知道,我们可以假设DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ENGLISH)也会在不同的设备上生成相同的日期字符串吗?有没有我没处理的边缘案例?

2 个答案:

答案 0 :(得分:1)

使用"MMM dd, yyyy"保留对输出的控制权,使用整数常量DateFormat.DEFAULT,您可以将其留给平台的区域设置定义。对于任何给定的语言环境,它们应该在这些平台上是相同的,但实际上并不能保证。

DateFormat.DEFAULT参数仅在您使用不同的区域设置时才有用,因为它允许DateFormat创建正确的本地化日期字符串。

示例:

DateFormat dfEn = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.ENGLISH);
DateFormat dfFr = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.FRENCH);
DateFormat dfGe = DateFormat.getDateInstance(DateFormat.DEFAULT, Locale.GERMAN);

System.out.println("ENGLISH: " + dfEn.format(date));
System.out.println("FRENCH : " + dfFr.format(date));
System.out.println("GERMAN : " + dfGe.format(date));

打印:

ENGLISH: Dec 26, 2015
FRENCH : 26 déc. 2015
GERMAN : 26.12.2015

答案 1 :(得分:-1)

我想确保渲染日期看起来总是一样的,因为它是您在第一个代码段中明确定义格式的最佳选择:

DateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.ENGLISH);

这里给定的区域设置没有定义格式,而是要使用的措辞,这里月份的名称是英文(" Dec"),而不是例如用德语(" Dez")。