Java 使单元测试的日期在所有时区内通过,且不带/不带DST

Java 使单元测试的日期在所有时区内通过,且不带/不带DST,java,unit-testing,timezone,Java,Unit Testing,Timezone,如何使单元测试在所有时区都通过,而与DST是否处于活动状态无关 import static org.junit.Assert.*; import java.text.SimpleDateFormat; import java.util.Date; import org.joda.time.DateTime; import org.junit.Test; public class TimeZoneTest { private final static SimpleDateFormat

如何使单元测试在所有时区都通过,而与DST是否处于活动状态无关

import static org.junit.Assert.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.joda.time.DateTime;
import org.junit.Test;

public class TimeZoneTest {

    private final static SimpleDateFormat DATE_FORMAT = new SimpleDateFormat( "yyyy.MM.dd'T'HH:mm.ss:SSSZZ" );

    @Test
    public void testUtilDateMillis() throws Exception {
        assertEquals( "1970.01.01T00:00.00:000+0000", DATE_FORMAT.format( new Date( 0L ) ) );
    }

    @Test
    public void testDateTimeMillis() throws Exception {
        assertEquals( "1970-01-01T00:00:00.000+00:00", new DateTime( 0L ).toString() );
    }
}

默认情况下,新的
SimpleDataFormat
将使用系统默认时区。如果您想要一个特定的时区,您应该在其上调用
setTimeZone

private final static SimpleDateFormat DATE_FORMAT = createFormat();

private static SimpleDateFormat createFormat() {
    // Make sure there are no locale-specific nasties, either...
    SimpleDateFormat ret = new SimpleDateFormat("yyyy.MM.dd'T'HH:mm.ss:SSSZZ",
                                                Locale.US);
    ret.setTimeZone(TimeZone.getTimeZone("Etc/UTC");
}
对于第二次测试,您希望将其更改为:

new DateTime(0L, DateTimeZone.UTC);

请注意,您通常不应该使用静态
SimpleDateFormat
变量,因为它不是线程安全的。(然而,
DateTimeFormatter
实现是线程安全的。)

或者您可以比较日期并放置

@Ignore("Timezone issues")
@Test

在单元测试中,我固定了时间字符串。他们现在应该是午夜了。我不想更改新的日期时间(0L)。但是在joda时间格式化程序上设置locale+时区也解决了这个问题。@Aarondigula:当然-我想你只是想调用toString。如果你允许使用DateTimeFormatter,生活会变得更好:)这将忽略整个测试。