簡體   English   中英

日期 Java 之間的時差?

[英]Time difference between Dates Java?

我一直在使用舊的 Date API 以yyyyMMdd'T'HHmmss格式計算兩次之間的時間差。

客戶端在請求中設置requestExpirationTime屬性,服務器進行驗證檢查以確保“ RequestExpirationTime 不早於當前系統時間”。

客戶:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
Timestamp originatingTimestamp = new Timestamp(new Date().getTime());

// duration is offset 5minutes for exmaple

Timestamp requestExpirationTimestamp = new Timestamp(originatingTimestamp.getTime() + duration); 
request.setRequestExpirationTimestamp(simpleDateFormat.format(requestExpirationTimestamp));

服務器:

try {
        Date systemTime = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss");

        String ret = request.getRequestExpirationTimestamp();
        if (ret != null) {
            Date requestExpirationTimestamp = sdf.parse(ret);
            if (requestExpirationTimestamp.before(systemTime)) {                    

            logger.info("Request timedout: RequestExpirationTime is before current system time");

                }
            }
        }

由於服務器上的systemTime采用 IST(印度標准時間)並且客戶端可以發送任何 UTC/IST,因此此代碼會出現問題。

我現在已移至 Java 8,因此我可以將舊日期 Api 留在 Java 中。

如何確保此類時區問題不會出現在我的代碼中? 我嘗試在服務器上的 SimpleDateFormat 中設置 timeZone,但new Date()在不同的服務器上表現不同。

任何幫助表示贊賞。

當客戶端發送的時間不是 UTC 時,例如印度標准時間 (IST),而服務器不知道客戶端使用的是哪個時區,那么服務器無法使其正常工作。 相反,我建議您確保客戶端始終以 UTC 格式發送時間。

客戶

確保始終以 UTC 格式發送時間:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmss");

    String requestExpirationTime = OffsetDateTime.now(ZoneOffset.UTC)
            .plusMinutes(5)
            .format(formatter);

    System.out.println(requestExpirationTime);

剛才運行的示例 output:

20200506T183409

服務器

現在服務器知道時間是 UTC。 我假設它使用的格式化程序與客戶端使用的格式化程序相同。

    OffsetDateTime dateTime = LocalDateTime.parse(requestExpirationTime, formatter)
            .atOffset(ZoneOffset.UTC);
    OffsetDateTime systemTime = OffsetDateTime.now(ZoneOffset.UTC);
    if (dateTime.isBefore(systemTime)) {
        System.out.println("Request timedout: RequestExpirationTime is before current system time");
    } else {
        System.out.println("OK");
    }

好的

小費

您可以 append Z到您的時間戳字符串,以明確表示它是 UTC。 它可能會在以后防止一些錯誤。

20200506T183409Z

暫無
暫無

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

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