【发布时间】:2020-08-21 20:06:48
【问题描述】:
我一直在使用旧版 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,因此我可以将旧版 Date Api 保留在 Java 中。
如何确保此类时区问题不会出现在我的代码中?我尝试设置 timeZone
服务器上的 SimpleDateFormat,但 new Date() 在不同服务器上的行为不同。
感谢任何帮助。
【问题讨论】:
-
考虑使用新的日期和时间 API(ZonedDateTime 或 Instant)和 Jackson (JSON) 或 JAXB (XML) 等框架来编组和解组日期。
-
如果客户端以
yyyyMMdd'T'HHmmss格式发送日期,您将无法知道时区或时间偏移量是多少。您需要在客户端使用包含时区或时间偏移的格式。
标签: java date java-8 timestamp java-time