UDT时间格式转换为时间戳

在与服务器交互时,网络请求需包含当前时间戳。若设备时间被修改,可能导致请求失败。解决方案是捕获404错误时解析返回的timestamp,将其转换为long类型的本地时间戳。若转换失败,则使用设备当前时间。
摘要由CSDN通过智能技术生成
问题描述

和客户对接服务器请求,网络请求中要求传入当前时间戳。
服务器请求间隔取间隔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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值