Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用
说明
一些游戏开发者在做单机游戏功能时(例如:每日奖励、签到等),可能会需要获得服务端标准时间,用于游戏功能的逻辑处理。
问题分析
1、自己如果有服务器:自定义一个后端API,客户端按需请求就行了;
2、如果没有服务器(本篇文章主要讲解的内容):
a、可以使用别人的免费API,但是通常问题比较多,例如:服务器关闭了、API禁用了等(该方案有风险);
b、更稳妥点的方案:请求大厂服务器(例如:百度、腾讯、Github等),获取其响应头时间;
那么,我们应该选择稳妥一点的方案:b。
通过抓包工具,我们抓一下网络请求,分析一下响应头,如下图:

通过上图可知,我们只需要正常请求大厂的最常用的URL,等待响应成功后,读取响应头中的“Date”属性就行了。
代码实现
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TestDate : MonoBehaviour
{
void Start ()
{
getServerTime ();
}
//获得服务器时间
public void getServerTime ()
{
string url1 = "https://www.baidu.com";
StartCoroutine (IServerTime (url1));
string url2 = "https://blog.csdn.net";
StartCoroutine (IServerTime (url2));
string url3 = "https://www.jianshu.com";
StartCoroutine (IServerTime (url3));
string url4 = "https://github.com";
StartCoroutine (IServerTime (url4));
string url5 = "https://www.sohu.com";
StartCoroutine (IServerTime (url5));
}
IEnumerator IServerTime (string url)
{
Debug.Log ("开始获取“+url+”的服务器时间(GMT DATE)");
WWW www = new WWW (url);
yield return www;
if (www.isDone && string.IsNullOrEmpty (www.error)) {
Dictionary<string,string> resHeaders = www.responseHeaders;
string key = "DATE";
string value = null;
if(resHeaders!=null && resHeaders.ContainsKey(key)){
resHeaders.TryGetValue (key,out value);
}
if(value==null){
Debug.Log ("DATE is null");
yield break;
}
//打印格林威治时间
Debug.Log (url+" 的 GMT DATE : "+value);
//打印本地时间(东八区)
Debug.Log (url+" 的 北京时间:"+ GMT2Local(value));
}
}
/// <summary>
/// GMT时间转成本地时间
/// </summary>
/// <param name="gmt">字符串形式的GMT时间</param>
/// <returns></returns>
public DateTime GMT2Local(string gmt)
{
DateTime dt = DateTime.MinValue;
try
{
string pattern = "";
if (gmt.IndexOf("+0") != -1)
{
gmt = gmt.Replace("GMT", "");
pattern = "ddd, dd MMM yyyy HH':'mm':'ss zzz";
}
if (gmt.ToUpper().IndexOf("GMT") != -1)
{
pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
}
if (pattern != "")
{
dt = DateTime.ParseExact(gmt, pattern, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
dt = dt.ToLocalTime();
}
else
{
dt = Convert.ToDateTime(gmt);
}
}
catch
{
}
return dt;
}
}
将脚本挂载到Unity游戏对象上,运行游戏,查看日志输出,如下图:

总结
该实现方案,非常简单使用,大家也无需担心大厂倒闭。
通过响应头取出来的时间,默认是格林威治时间(GMT)。
上面案例中,已做了格林威治时间转换为东八区时间(北京时间),如果大家做的游戏是要发布到全世界的,最好再根据不同国家的时区,进行计算一下。
Unity3D获得服务器时间/网络时间/后端时间/ServerTime,适合单机游戏使用的更多相关文章
- Centos7安装搭建NTP服务器和NTP客户端同步时间
NTP简介: NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要 例如:对于火箭发射这种科研活动,对时间的 ...
- [Swift]Alamofire:设置网络请求超时时间【timeout】的两种方式
两种方式作用相同,是同一套代码的两种表述. 第一种方式:集聚. 直接设置成员属性(全局属性),这种方法不能灵活修改网络请求超时时间timeout. 声明为成员属性: // MARK: - 设置为全局变 ...
- php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)
php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...
- 搭建NTP时间服务器~使用NTP同步时间~构建主机间时间自动同步关系
NTP是一个时间服务器,同时它也是一个时间客户端. 我们可以使用它构建主机与主机之间的时间自动同步环境,保证所有服务器时间一致性. 常用的公共NTP时间服务器有: cn.ntp.org.cn 中国 n ...
- 如何查看Windows服务器运行了多长时间
前言:有时候管理.维护Windows服务器需要定期重启服务器(为什么需要重启,你懂的),但是这个"定期"有时候会受很多因素影响,例如某台服务器忘了重启:某台服务器那个时间段业务繁忙 ...
- 通过更改服务器解决双系统ubuntu时间+8
安装ntpdate: sudo apt-get install ntpdate 设置校正服务器: sudo ntpdate time.windows.com 设置硬件时间为本地时间: sudo hwc ...
- Loadrunner时间函数、用时间生成订单编号例子
Loadrunner中取时间函数.用时间函数生成订单编号例子: <如要转载,请注明网络来源及作者:Cheers_Lee> 问题的提出: (1)有时候在Loadrunner中用C语言设计脚本 ...
- Linux操作系统时间与BIOS硬件时间
注:以Ubuntu为例说明 在Linux计算机上,有两个时间,一个是硬件时间(BIOS中记录的时间,称为hwclock),另一个是操作系统时间(osclock).硬件时钟由BIOS电池供电, 当计算机 ...
- CentOS7日期时间设置方法以及时间基本概念介绍
在CentOS 6版本,时间设置有date.hwclock命令,从CentOS 7开始,使用了一个新的命令timedatectl. 一.基本概念 1.1 GMT.UTC.CST.DST 时间 (1) ...
随机推荐
- Vue watch对象属性并触发多个事件
在vue中监控一个对象的属性变化,并且触发监听事件 watch: { 'user': [ { handler: (nweVal, oldVal) => { console.info('in 1 ...
- 解决AndroidStudio 模拟器无网络连接
更新 注意 Win10 要在cmd下打开, 也就是地址栏打cmd能成功 转载地址 https://blog.csdn.net/Bibifeng/article/details/81317037 最近写 ...
- CTF bossplayers 靶机
WAYs: robots.txt文件提供线索,命令执行漏洞获得反弹shell suid命令提升权限 1:netdiscover 发现主机地址192.168.1.109 2:使用namp进行端口扫描发现 ...
- js利用canvas绘制爱心
js代码如下: var cav = document.getElementById("a").getContext("2d"); function draw(x ...
- 记好这 24 个 ES6 方法,用来解决实际开发的 JS 问题
本文主要介绍 24 中 es6 方法,这些方法都挺实用的,本本请记好,时不时翻出来看看. 1.如何隐藏所有指定的元素 const hide = (el) => Array.from(el).fo ...
- Name jms can't bind to context问题解决
需要把gis-datamanage包中的配置test改成compile
- 理解RESTful原理
如何给老婆解释什么是RESTful 老婆经常喜欢翻看我订阅的技术杂志,她总能从她的视角提出很多有趣的问题. 一个悠闲的周日下午,她午觉醒来,又习惯性的抓起这个月的杂志,饶有兴趣地看了起来. 果不其然, ...
- 使用folderLeft函数统计字母出现的次数
实例:统计字符串中字母出现的次数 import scala.collection.mutable object Demo_018{ def main(args: Array[String]): Uni ...
- 进阶6:连接查询 一、sql92标准
#进阶6:连接查询/*含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 笛卡尔乘积现象:表1 有m行,表2有n行,结果=m*n行 发生原因:没有有效的连接条件如何避免:添加有效的连接条 ...
- swagger2配置详解
1.写在controller上的注解 1.1 @Api 代码 @Api(tags = "用户相关接口", description = "提供用户相关的 Rest API& ...