iOS 同步服务器时间

作者: DH_Fantasy | 来源:发表于2017-08-12 22:38 被阅读1119次

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

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

将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

相关文章

网友评论

    本文标题:iOS 同步服务器时间

    本文链接:https://www.haomeiwen.com/subject/oysjrxtx.html