需求

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

分析

描述

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

  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关于时间的处理

最新文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构
  2. java中判断字符串是否为数字的方法
  3. JavaScript POST 请求如何跨域
  4. hdu4914 Linear recursive sequence
  5. ThinkAndroid是简洁,快速的进行Android应用程序的框架
  6. Lombok(1.14.8) - @Getter, @Setter, @ToString, @EqualsAndHashCode & @Data
  7. setTimeout的作用以及setTimeout延时0毫秒的作用
  8. Cortex-A9 UART
  9. HTML中的javascript交互
  10. 读JVM相关的一些笔记
  11. wxpy使用
  12. centos7 安装 redis-4.0.9
  13. python 字符串常用操作方法
  14. SSH整合Maven教程
  15. 1788:Pell数列
  16. Linux设备驱动剖析之SPI(四)
  17. 《DSP using MATLAB》Problem 2.8
  18. vue项目 webpack打包后,图片路径是绝对路径
  19. 如何停止你的Streaming Application
  20. 【笔记】IntelliJ IDEA配置Hibernate

热门文章

  1. 8. docker image 的发布 与 docker registry 私有仓库
  2. abstract关键字、final关键字、static关键字、访问修饰符详解
  3. jacascript 滚动scroll
  4. iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码
  5. apt源换国内源
  6. Linux c 操作MySQL
  7. centos7 国内镜像yum安装mysql5.7
  8. sql server 重命名表名,字段名
  9. druid yml
  10. LeetCode No.130,131,132