帖子
帖子
用户
博客
课程
12下一页
返回列表 发新帖
显示全部楼层
51
帖子
1
勋章
617
Y币

[App引擎] new Date()获取系统时间的问题

[复制链接]
发表于 2016-11-30 23:16:10
问题:比如北京时间是2016-11-30,但是用户故意将手机的系统时间设置为2016-10-30,那在页面上使用new Date()就不准确了,有什么方法可以让new Date()能在这种情况下获取的时间是真实的???
51
帖子
1
勋章
617
Y币
本帖最后由 cysell 于 2016-12-1 01:58 编辑

已解决!!!

一、先在api.js文件尾部加上以下代码:
  1. u.date = function() {
  2.         var xhr = new window.XMLHttpRequest();
  3.         xhr.open("POST", "http://www**.**/robots.txt", false);
  4.         xhr.send(null);
  5.         if (xhr.readyState == 4 && xhr.status == 200) {
  6.             return xhr.getResponseHeader("Date");
  7.         } else {
  8.             return '';
  9.         }
  10.     };
复制代码


二、直接可以在页面上调用new Date($api.date())就能获取最准确时间

51
帖子
1
勋章
617
Y币
APP开发人员经常会遇见一个bug就是,APP显示的时间不准,或者说APP时间与服务器时间不一致,会导致数据请求、数据显示等各种问题。这时候我们就需要一种机制来解决时间不一致的问题。
解决方案如下:
服务器端永远使用UTC时间,包括参数和返回值,不要使用Date格式,而是使用UTC时间1970年1月1日的差值,即long类型的长整数。
APP端将服务器返回的long型时间转换为GMT8时区的时间,额外加上8小时,这样就保证了无论使用者在哪个时区,他们看到的时间都是同一个时间,也就是GMT8的时间。
APP本地时间会不准,少则差几分钟,多则十几分钟,要解决这个问题,我们可以使用HTTP Response头的Date属性,每次调用服务器接口时就取出HTTP Response头的Date值,转换为GMT时间,再减去本地取出的时间,得到一个差值d,我们将这个差值d保存下来。每次获取本地时间的时候,额外加上这个差值d,就得到了服务器的GMT8时间,就保证了任何人看见的时间都是一样的。
一个案例:
46
帖子
6
勋章
6万+
Y币
那得发个请求来获取了吧,获取服务器时间
51
帖子
1
勋章
617
Y币
狼哥1996 发表于 2016-11-30 23:22
那得发个请求来获取了吧,获取服务器时间

好像只能这样,客户端要做条件判断的,不然结果会不准确
51
帖子
1
勋章
617
Y币

  1.     u.date = function() {
  2.         var xhr = new window.XMLHttpRequest();
  3.         xhr.open("HEAD", "http://www**.**或者http://timestamp**.**", false);
  4.         xhr.send(null);
  5.         if (xhr.readyState == 4 && xhr.status == 200) {
  6.             return xhr.getResponseHeader("Date");
  7.         } else {
  8.             return '';
  9.         }
  10.     };
复制代码
4
帖子
1
勋章
1479
Y币
cysell 发表于 2016-12-1 01:29
已解决!!!

一、先在api.js文件尾部加上以下代码:

谢谢分享,学习了
51
帖子
1
勋章
617
Y币
补充一下:
如果出现跨域的问题,那就在自己的服务器上放一个PHP文件,然后加上以下代码,然后请求URL就能返回DATE,
  1. <?php
  2. header("Access-Control-Allow-Origin:*");
  3. header("Access-Control-Expose-Headers:Date");
  4. header("Access-Control-Allow-Method:*");
  5. header("Access-Control-Max-Age:0");
  6. echo gmdate('D, d M Y H:i:s T');

  7. ?>
复制代码
18
帖子
2
勋章
3万+
Y币
获取服务器的时间还是可靠些
4
帖子
0
勋章
23
Y币
为什么会报这种错?
XMLHttpRequest cannot load http://www**.**/robots.txt. Origin http://192.168.253.7:10915 is not allowed by Access-Control-Allow-Origin. at addtakephotos.html : 0
Uncaught NetworkError: A network error occurred. at api.js : 596
12下一页
您需要登录后才可以回帖 登录

本版积分规则