问题描述
和客户对接服务器请求,网络请求中要求传入当前时间戳。
服务器请求间隔取间隔1天1次。
当测试时发现第一次可以正常获取,想测试第二次的值,手动改了设备时间到2天后,发现请求异常。
问题分析
网络请求中要求传入时间戳,如果修改设备时间,传入的时间戳和服务器的时间不匹配,服务器会认为非法请求,返回404.
result: {"timestamp":"2023-03-10T09:12:23.034+00:00","status":404,"error":"Not Found","path":"/ads"}
获取服务器时间
以上log中发现,服务器404的时候会带timestamp参数。
如果后续的请求传入timestamp中的时间,就不会因为设备时间导致后续请求异常。
方案
首次获取服务器异常时,解析timestamp参数。
但是时间格式很诡异,单T的UTC时间格式,需要转化为long类型的时间戳。
private final String YMDHMS_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
@SuppressLint("SimpleDateFormat")
public long utc2Local(String utcTime) {
try {
if (TextUtils.isEmpty(utcTime)) {
return -1;
}
SimpleDateFormat utcFormater = new SimpleDateFormat(YMDHMS_FORMAT);
utcFormater.setTimeZone(TimeZone.getTimeZone("UTC"));
Date gpsUTCDate = null;
try {
gpsUTCDate = utcFormater.parse(utcTime);
} catch (ParseException e) {
e.printStackTrace();
return -1;
}
return gpsUTCDate.getTime();
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
使用的地方,解析服务器时间,如果解析异常,使用当前设备时间
long serviceTimeMillis = utc2Local(time);
long currentTimeMillis = System. currentTimeMillis();
if (serviceTimeMillis == -1){
serviceTimeMillis = currentTimeMillis;
}