我的理想方式是使用以下代码
来设置与语言环境无关的日期字符串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)
也会在不同的设备上生成相同的日期字符串吗?有没有我没处理的边缘案例?
答案 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")。