iOS 同步服务器时间

本文介绍了一种在App启动后同步服务器时间的方案,包括获取服务器时间戳并保存至本地、计算时间差、处理获取失败情况及监测系统时间变化等步骤。提供了两种获取服务器时间的方法:一是通过服务端接口,二是通过HTTPHeader。

  在项目中遇到需要同步服务器时间的需求,解决方案如下。

1.App启动后获取服务器当前时间时间戳ServerTimeStampA,获取成功后保存至本地,并同时保存客户端当前时间时间戳LocalTimeStampA; 2.在需要使用到服务器时间时,先获取客户端当前时间时间戳LocalTimeStampB,再获取interval = LocalTimeStampB - LocalTimeStampA,服务器时间时间戳即为:ServerTimeStampA + interval,将其转换为时间即可; 3.如果获取服务器时间失败,则视服务器时间与本地时间相同; 4.使用NSSystemClockDidChangeNotification监测系统时间发生改变 ,如果系统时间发生改变则重新获取一次服务器时间。

// 获取服务器时间并保持至本地
double serverTimeStamp = 1502534359727.2739; // 模拟服务器当前时间时间戳,精确到毫秒
[[NSUserDefaults standardUserDefaults] setDouble:serverTimeStamp forKey:kLastSaveServerTimeStamp];
double currentLocalTimeStamp = [[NSDate date] timeIntervalSince1970] * 1000;
[[NSUserDefaults standardUserDefaults]setDouble:currentLocalTimeStamp forKey:kLastSaveLocalTimeStamp];
[[NSUserDefaults standardUserDefaults] synchronize];
复制代码

获取服务器时间有两种方法 方法一:服务端同学给一个获取服务器时间接口; 方法二:通过HTTP Header来获取服务器时间(注:时间格式以RFC-7231中定义的"HTTP日期"格式来发送,见下图)。

// 获取HTTP Header
NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
NSDictionary *allHeaders = response.allHeaderFields;
复制代码

将HTTP Header中的时间转换为NSDate可使用NSDate+InternetDateTime.m

// 转换方法
NSDate *inputDate = [NSDate dateFromInternetDateTimeString:dateServer formatHint:DateFormatHintRFC822];

NSDate *inputDate = [NSDate dateFromRFC822String:dateServer];
复制代码

为NSDate创建Category

// 服务器当前时间戳(精确到毫秒)
+ (double)serverCurrentTimeStamp{
    // 最后保存的服务器时间戳
    double lastSaveServerTimeStamp = [[NSUserDefaults standardUserDefaults] doubleForKey:kLastSaveServerTimeStamp];
    // 最后保存服务器时间戳时的本地时间戳
    double lastSaveLocalTimeStamp = [[NSUserDefaults standardUserDefaults] doubleForKey:kLastSaveLocalTimeStamp];
    // 当前本地时间戳
    double currentLocalTimeStamp = [[NSDate date] timeIntervalSince1970] * 1000;
    
    if (lastSaveLocalTimeStamp != 0 || lastSaveServerTimeStamp != 0) {
        return lastSaveServerTimeStamp + (currentLocalTimeStamp - lastSaveLocalTimeStamp);
    }else{
        // 如果没有获取到服务器时间,说明客户端还没开始用过,则视服务器时间与本地时间相同
        return  currentLocalTimeStamp;
    }
}
复制代码
// 服务器当前时间
+ (NSDate *)serverCurrentDate{
    double serverTimeStamp = [NSDate serverCurrentTimeStamp] / 1000;
    NSDate *serverDateZone = [NSDate dateWithTimeIntervalSince1970:(serverTimeStamp)];
    NSTimeZone *timeZone = [NSTimeZone systemTimeZone];
    NSInteger interval = [timeZone secondsFromGMTForDate:serverDateZone];
    NSDate *serverDate = [serverDateZone dateByAddingTimeInterval:interval];
    return serverDate;
}
复制代码

####参考链接 1.时间与日期处理 2.通过AFNetworking获取服务器时间 3.iOS关于时间的处理


联系作者:简书·DH_Fantasy 新浪微博·DH_Fantasy 版权声明:自由转载-非商用-非衍生-保持署名(CC BY-NC-ND 3.0

转载于:https://juejin.im/post/5a9021f15188257a631126ee

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值