Java 日期格式问题

Java 日期格式问题,java,date,timezone,format,Java,Date,Timezone,Format,以下Java测试在我们的美国托管构建服务器上通过。它还通过非美国服务器传递,例如在德国。它在爱尔兰运行的本地服务器上出现故障。下面的代码说明了一个失败的测试 org.junit.ComparisonFailure: expected:<[4/6/09 11:30 AM]> but was:<[06/04/09 11:30]> 必须尝试为客户提供一种模式吗 SimpleDataFormat日期格式化程序=新的SimpleDataFormat(“d/M/yy HH:mm a

以下Java测试在我们的美国托管构建服务器上通过。它还通过非美国服务器传递,例如在德国。它在爱尔兰运行的本地服务器上出现故障。下面的代码说明了一个失败的测试

org.junit.ComparisonFailure: expected:<[4/6/09 11:30 AM]> but was:<[06/04/09 11:30]>

必须尝试为客户提供一种模式吗


SimpleDataFormat日期格式化程序=新的SimpleDataFormat(“d/M/yy HH:mm a”)

时间是正确的,但是
SimpleDateFormat()
构造函数使用
Locale.getDefault()
在内部调用包私有构造函数。因此,您可以提供自己的格式,也可以提供另一个区域设置,这似乎只能通过自定义格式实现,即使用
SimpleDataFormat(字符串模式,区域设置)


问题是
SimpleDataFormat()
使用了依赖于区域设置的模式,因此系统的默认区域设置可能会导致与美国不同的模式(我假设德国服务器不使用德国区域设置作为默认设置,因为从那时起,您应该获得类似
06.04.09 11:30
)的日期。

嗯。。。你在测试什么?这里没有测试你的代码。这个测试只是为了验证Java类是如何工作的吗;。。。。。为了可读性,测试中的代码只是内联的。这些行表示测试中的代码:SimpleDataFormat dateFormatter=new SimpleDataFormat();最终字符串formattedOutput=dateFormatter.format(utilDate);那么,在您的测试代码中有一个bug:如果您需要一个特定的格式,那么您应该实际提供该格式(在
SimpleDataFormat
构造函数中),而不仅仅是假设您的系统配置为提供您所需的格式。“系统的默认区域设置”-是的,这就是我的想法。我将我的windows日期格式从dd/MM/yyyy更新为MM/dd/yyyy-但这没有任何区别。@Damo您在操作系统中更改了格式吗?注意,AFAIK这对Java没有影响。特定于语言环境的格式通常嵌入到Java库中。但是Java选择系统提供的区域设置作为默认设置。您应该能够通过使用以下系统属性来更改所使用的区域设置:
-Duser.language=en-Duser.country=IE
我能够使用“export LC\u ALL=en\u US.UTF-8”更新系统区域设置,这将使测试通过yes。我宁愿不必更改代码或测试。这个测试对我在德国和美国的开发伙伴都有效。您应该能够使用:
-Duser.language=xz-Duser.country=xz
将JVM设置为本地,如中所示,我发现最干净的解决方案是更新我的cygwin env,使用命令export LC_ALL=en_US.UTF-8-感谢您的解决方案
public void testFormattedDate() {
// Set the default time zone in case this unit test is executed in a different country
TimeZone.setDefault(TimeZone.getTimeZone(DateUtil.DEFAULT_TIMEZONE));
final Date utilDate = new Date();
utilDate.setDate(6);
utilDate.setHours(11);
utilDate.setMinutes(30);
utilDate.setMonth(3);
utilDate.setSeconds(45);
utilDate.setYear(109);

SimpleDateFormat dateFormatter = new SimpleDateFormat();        
final String formattedOutput = dateFormatter.format(utilDate);

Assert.assertEquals("4/6/09 11:30 AM", formattedOutput);
}