日期 Java 之间的时差?
Time difference between Dates Java?
我一直在使用遗留日期 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,所以我可以在 Java.
中保留遗留日期 Api
如何确保我的代码中不会出现此类时区问题?我尝试在中设置时区
服务器上的 SimpleDateFormat 但 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);
刚才 运行 的示例输出:
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");
}
OK
提示
您可以将 Z
附加到您的时间戳字符串以明确表示它是 UTC。它可能会防止以后出现一些错误。
20200506T183409Z
我一直在使用遗留日期 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,所以我可以在 Java.
中保留遗留日期 Api如何确保我的代码中不会出现此类时区问题?我尝试在中设置时区
服务器上的 SimpleDateFormat 但 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);
刚才 运行 的示例输出:
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");
}
OK
提示
您可以将 Z
附加到您的时间戳字符串以明确表示它是 UTC。它可能会防止以后出现一些错误。
20200506T183409Z