簡體   English   中英

由於時區不同,時間戳時間不匹配

[英]Timestamp time mismatch because of the different time zone

我的團隊收到了一個新項目。 該項目有一堆沒有通過的測試。 用他們的話說,所有的測試都應該通過。 在調查問題后,我發現存在一個共同的問題。 大多數失敗的測試創建Timestamp並使用它,但預期和實際日期不一樣。 差別只有一個小時。 舊的開發團隊一直在GMT + 1區域工作,我們的工作是GMT + 2。

為什么會這樣?

編輯

我有一個測試,它創建實體Rating並設置一堆屬性。 例如:

rating.setValidFromDate(new Timestamp(1459841866798L));

然后測試斷言一個預期的String常量和rating.toString()

正如我所說,差異恰好是1小時

編輯2

@Test
public void testToString() {
    Rating rating = new Rating();
    rating.setValidFromDate(new Timestamp(1459841866798L));

    assertEquals("Rating{validFromDate='2016-04-05 09:37:46'}", rating.toString());
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append(Rating.class.getSimpleName());
    builder.append("{");
    builder.append("validFromDate='" + DateHelper.getStringFromDate(validFromDate) + "'");
    builder.append("}");
    return builder.toString();
}

public static String getStringFromDate(Date dateValue) {
    String strDate = "";
    if (dateValue != null) {
        DateFormat dateFormat = new SimpleDateFormat(Constants.DATETIME_FORMAT);
        strDate = dateFormat.format(dateValue);
    }
    return strDate;
}

解決了

我決定給你解決這個問題的方法。

閱讀本文后: java.sql.Timestamp:更改Timestamp的時區我找到了一種操作測試時區的方法。 所以我決定編寫一個JUnit規則來執行所有測試。

我寫了以下聲明:

public class GermanTimeZoneStatement extends Statement {

    private final Statement base;

    public GermanTimeZoneStatement(Statement base) {
        super();
        this.base = base;
    }

    @Override
    public void evaluate() throws Throwable {
        TimeZone.setDefault(TimeZone.getTimeZone("Europe/Berlin"));
        base.evaluate();
    }
}

之后我寫了這條規則:

public class GermanTimeZoneRule implements TestRule {

    public static GermanTimeZoneRule getInstance() {
        return new GermanTimeZoneRule();
    }

    @Override
    public Statement apply(Statement base, Description description) {
        return new GermanTimeZoneStatement(base);
    }
}

最后,我在我的測試中包含了這樣的規則,如下所示:

    @Rule
    public GermanTimeZoneRule germanTimeZoneRule = GermanTimeZoneRule.getInstance();

您正在測試的代碼與時區有關。 它根據用戶默認時區中的時間輸出特定日期。 這就是為什么它為你的同事提供不同的輸出。

您需要返回該代碼的規范,並檢查這是否是預期的行為。 如果是,則需要修改測試以考慮時區。 如果這不是預期的行為,那么恭喜你,你的測試暴露了一個錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM