[英]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.