原创
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
前一段时间做了一个倒计时的功能,要求每个tableViewcell里面都嵌入倒计时的功能。我也封装了一个工具类,详细请看这里但是倒计时如果不是用服务器的现在时间进行剩余时间计算的话,就可能出现bug(比如一个商品,倒计时1小时停售,服务器已经过了这停售时间,从而停售了,但是客户端的时间比服务器时间向后调了1小时,那么客户端就会以为还没有停售)这就要求要用客户端的时间求出服务器的时间
1、大体思路
其实很简单就说一下大体的思路,在附一个小的工具类,很简单。。。
1. 封装一个类,在请求到后台的时间戳后,把本地时间与后台时间戳进行对比,记录时间差,最后每次时间计算的时候,都可以用本地时间求出服务器的时间。
2. 关键是什么时候请求服务器时间。
1.我们先分析一下,首先,这种时间差,越早知道越好,所以,在app启动的时候就要请求服务器时间,并计算差值。
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {} app刚刚启动的时候创建并给出serverTime,内部计算了服务器时间
2.假设,用户很调皮,在app运行后,就退出去,对手机的时间设置成一个随意时间。那再进来,再用以前储存的时间差计算服务器时间,岂不是炸了。
所以在app进入后台、应用程序编程不激活状态、从后台进入到前台等都要调用一下,一下代码满足了这些时机的需求
-(void)applicationWillResignActive:(UIApplication *)application {} 应用程序变成不激活状态,双击home建,应用程序不在相应用户点击的时候 -(void)applicationDidEnterBackground:(UIApplication *)application{} 应用程序进入到后台的时候调用,双击home建不会调用 -(void)applicationWillEnterForeground:(UIApplication *)application{} 应用程序从后台进入到前台以后调用这个方法, 应用启动不会调用 -(void)applicationDidBecomeActive:(UIApplication *)application{} 应用程序变为激活状态的时候会调用这个方法,(用户可以进行用户交互的时候调用) -(void)applicationWillTerminate:(UIApplication *)application{} 系统将要推出(终止)的时候调用
2. 代码剪辑
.h
#import@interfacePYServerAndClientTime :NSObject///单利 + (instancetype) sharedServerAndClientTime; ///内部创建了sharedServerAndClientTime对象 + (instancetype) serVerAndClientTimeWithServerTime: (NSString *)serverTime; ///服务器的时间戳@property (nonatomic,copy)NSString *serverTime; ///计算后的服务器时间@property (nonatomic,strong,readonly)NSDate *serverAndClientDate; ///计算后服务器时间的timeInterval@property (nonatomic,assign,readonly)NSNumber *serverAndClientTimeInterval; ///服务器与客户端时间的时间差@property (nonatomic,assign,readonly)NSNumber *timeDifference; @end
.m
@implementationPYServerAndClientTime + (instancetype) sharedServerAndClientTime {staticdispatch_once_t onceToken;static PYServerAndClientTime *_instance;dispatch_once(&onceToken, ^{ _instance = [[self alloc]init]; });return _instance; } +(instancetype) serVerAndClientTimeWithServerTime: (NSString *)serverTime { PYServerAndClientTime *serverAndClientTime = [PYServerAndClientTime sharedServerAndClientTime]; serverAndClientTime.serverTime = serverTime;return serverAndClientTime; } //MARK: setter -(void)setServerTime:(NSString *)serverTime { _serverTime = serverTime;double serverTimeDouble = serverTime.longLongValue;//计算当前的时间秒数NSTimeInterval currentDateInterval = [[[NSDate alloc]init] timeIntervalSince1970];//计算时差NSNumber *timeDifferenceTemp = @(serverTimeDouble - currentDateInterval); [self setValue:timeDifferenceTemp forKey:@"timeDifference"]; } //MARK: getter -(NSDate *)serverAndClientDate {return [NSDate dateWithTimeIntervalSinceNow:self.timeDifference.doubleValue];; } -(NSNumber *)serverAndClientTimeInterval {return @([self.serverAndClientDate timeIntervalSince1970]); } @end
appDelegate
#import"AppDelegate.h"#import"PYServerAndClientTime.h"@interfaceAppDelegate ()@end@implementationAppDelegate//根据服务器时间计算与本地时间的时间差 -(void)serverAndClientTime {/**...... 服务器请求数据 ....... */NSString *serverTime;//服务器求情下来之后的服务器时间戳 PYServerAndClientTime *serverAndClientTime = [PYServerAndClientTime sharedServerAndClientTime]; serverAndClientTime.serverTime = serverTime; } -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//app刚刚启动的时候创建并给出serverTime,内部计算了服务器时间 [self serverAndClientTime];returnYES; } -(void)applicationWillResignActive:(UIApplication *)application {// 应用程序变成不激活状态,双击home建,应用程序不在相应用户点击的时候 [self serverAndClientTime]; } -(void)applicationDidEnterBackground:(UIApplication *)application {//应用程序进入到后台的时候调用,双击home建不会调用 [self serverAndClientTime]; } -(void)applicationWillEnterForeground:(UIApplication *)application {//应用程序从后台进入到前台以后调用这个方法, 应用启动不会调用 [self serverAndClientTime]; } -(void)applicationDidBecomeActive:(UIApplication *)application {//应用程序变为激活状态的时候会调用这个方法,(用户可以进行用户交互的时候调用) [self serverAndClientTime]; } -(void)applicationWillTerminate:(UIApplication *)application {//系统将要推出(终止)的时候调用 } @end
有0 个人打赏
在网页上做倒计时的功能,发现服务器和客户端存在时间差。下面讲解消除时间差的方法。原理:向服务器请求数据的时候,服务器返回一个服务器时间的变量server_time,客户端获取本地的时间client_t...博文来自: 感恩、奋进、自信
服务器与客户端的时间同步服务器、客户端全部代码下载:https://download.csdn.net/download/lyhoo1...博文来自: lyhoo163的专栏
多台Linux虚拟机时间不一致的解决方法2018年08月09日,在学习Mysql主从及主主同步时发现所用到的两台虚拟机时间存在不一致性,如下图所示:因为这两台虚拟机都是从模板机上克隆出来的,在模板机...博文来自: 紫色飞猪
客户端实现准确的服务器时间同步,这篇博文是转过来的,原博文地址为:http://blog.csdn.net/chelen_jak/article/details/35335785,运气的缘故在我最需要...博文来自: poker_face的博客
以服务器时间为准 服务器时间00:00 客户端时间10:00 差十分钟 你说咋办。。。。 一些效果在客户端显示 DateTime.Now然后无语了。。。。论坛
Mssql服务器上有一个表:Table1,里面有一个字段“更新时间” ,类型为:Datetime 我在VFP9中用以下代码不能插入新记录,大家指点一下吧: t=CTOT("2011/01/02 13:论坛
测试测试时,发现一个bug,订单的xx支付时间比下单时间早一秒。经过查看代码,发现生成下单时间的方式是在java中newDate(),然后将值插入数据库,然后xx支付时间是在mybatis的xml中使...博文来自: joenqc的博客
AD域中客户端时间与服务器时间不同步的解决办法公司考勤用的是国内一家OA软件里的考勤模块,个人在电脑上在规定时间内登记的形式,客户端都是采取域用户登录的形式,电脑客户端的时间显示比OA登记的时间晚两分...博文来自: weixin_34186950的博客
最近在搞测试的时候,发现服务器在和本地通信的时候,会出现超时的情况,首先排除了网络带宽的问题。然后在查看超时的服务器上的时间是发现了问题:有3台服务器的时间和本地时间相差很多。于是着手开始处理时间差。...博文来自: 为一个人走几座城
本人开发中遇到一个问题如下:requestheadersPOST/user/loginHTTP/1.1Host:www.linhongzhao.comConnection:keep-aliveCont...博文来自: FUNCO_小风