需求

我们做客户端的时候,有时会需要对客户端与服务器的时间进行同步,比如抢购活动、倒计时等。这时我们要考虑如何准备地与服务器的时间进行同步,同时防止用户本地的时间有误差时导致的问题。

分析

描述

为了实现以上需求,我们需要:

  1. 获取服务器某一时刻 A 的时间;

  2. 记录获取到时刻 A 时的本地时间 B

  3. 需要用到时间时,获取当前本地时间 C,当 C - B 作为时间间隔 D,则 A + D 则是当前服务器的时间。

实现

  1. 从上面的步骤,我们可以得到,要消除用户修改时间导致的影响,必须保证 BC 与系统时间无关;

  2. iOS 中正好有提供这样两个接口:

    1. 获取设备当前时间 Now,该值受系统时间影响,用户如果修改时间,值也会随着变化;

    2. 获取设备上次重启的时间 BootTime,该值受系统时间影响,用户如果修改时间,值也会随着变化;;

  3. 由上面 iOS 提供的两个接口,我们可以获取本地时间 BC:设备自上次重启后运行的时间(BootTime - Now),该值与系统时间无关;

代码实现

获取当前 Unix Time:

1
2
3
4
5
6
大专栏  iOS 客户端与服务端做时间同步e">static func now() -> Int {
var now = timeval()
var tz = timezone()
gettimeofday(&now, &tz)
return now.tv_sec
}

获取设备上次重启的 Unix Time:

1
2
3
4
5
6
7
8
9
10
11
func boottime() -> Int {
var mid = [CTL_KERN, KERN_BOOTTIME]
var boottime = timeval()
var size = MemoryLayout.size(ofValue: boottime)
if sysctl(&mid, 2, &boottime, &size, nil, 0) != -1 {
return boottime.tv_sec
}
return 0
}

时间校准:

1
2
3
4
5
6
7
// 接口获取服务器时间处理
let serverTime = xxx // 获取到的服务器时间
let runTime0 = now() - boottime() // 当前设备运行时间
// 需要用到时间时
let runTime1 = now() - boottime() // 当前时刻设备运行时间
let currentTime = serverTime + runTime1 // 当前服务器时间

参考

iOS关于时间的处理

iOS 客户端与服务端做时间同步的更多相关文章

  1. 抽取一部分服务端做BFF(Backend For Frontend服务于前端的后端)

    Flutter+Serverless端到端研发架构实践 · 语雀 https://www.yuque.com/xytech/flutter/kdk9xc 2019-12-19 13:14 作者:闲鱼技 ...

  2. TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况

    TLSv1.3 Support:主流 Web 客户端和服务端对 TLSv1.3 的支持情况 请访问原文链接:https://sysin.org/blog/tlsv1-3-support/,查看最新版. ...

  3. [Java]Hessian客户端和服务端代码例子

    简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...

  4. SignalR 实现web浏览器客户端与服务端的推送功能

    SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...

  5. Fresco 源码分析(二) Fresco客户端与服务端交互(3) 前后台打通

    4.2.1.2.4 PipelineDraweeControllerBuilder.obtainController()源码分析 续 上节中我们提到两个核心的步骤 obtainDataSourceSu ...

  6. Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题

    4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...

  7. C# TCP实现多个客户端与服务端 数据 与 文件的传输

    C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...

  8. Java实现UDP之Echo客户端和服务端

    Java实现UDP之Echo客户端和服务端 代码内容 采用UDP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  9. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

随机推荐

  1. JSONP 跨域问题

    JSONP跨域请求   什么是跨域: 1.域名不同 2.域名相同端口不同 js出于对安全考虑不支持跨域请求.我们可以使用JSONP解决跨域问题. 一.JSONP是什么 JSONP(JSON with ...

  2. STL入门练习

    题目练习地址https://vjudge.net/contest/310054#overview     看病要排队 http://acm.hdu.edu.cn/showproblem.php?pid ...

  3. Macroevolution|Silent changes|CNEs|Transposable elements|Neutral sites

    Interspecies genomic comparison 因为脊椎动物诞生早,在演化过程中有Macroevolution(因为自然选择或遗传漂变导致持续突变同时表型发生改变),但是存在一种基因缺 ...

  4. 六、linux-mysql的mysql字符集问题

    一.什么是字符集? 字符集是用来定义mysql数据字符串的存储方式,而校对规则则是定义比较字符串的方式.mysql字符集包含字符集和校对规则. 二.字符集的选择 常见的字符集中,中英混合环境建议用UT ...

  5. SAP PM:设备主数据常用BAPI

    如下参考: STATUS_CHANGE_EXTERN BAPI_EQMT_MODIFY BAPI_EQUI_CHANGE PM BAPI: Change Equipment BAPI_EQUI_CRE ...

  6. 四剑客(awk)

    AWK AWK简介 虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制.通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来修改和重新组织文件中的数据.这正是ga ...

  7. z-scores|zα

    6.2 Areas Under the Standard Normal Curve Property 4: Almost all the area under the standard normal ...

  8. numpy矩阵运算--矩阵乘法

    1)元素对应相乘,使用 multiply 函数或 * 运算符来实现 a = np.array([2,2,2])b = np.array([3,3,3]) c1 = a*a c1 array([4, 4 ...

  9. 吴裕雄--天生自然python学习笔记:pandas模块DataFrame 数据的修改及排序

    import pandas as pd datas = [[65,92,78,83,70], [90,72,76,93,56], [81,85,91,89,77], [79,53,47,94,80]] ...

  10. HTML配色表方案