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) ...
随机推荐
- C#LeetCode刷题之#404-左叶子之和(Sum of Left Leaves)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4084 访问. 计算给定二叉树的所有左叶子之和. 3 / ...
- C#LeetCode刷题之#374-猜数字大小(Guess Number Higher or Lower)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3993 访问. 我们正在玩一个猜数字游戏. 游戏规则如下: 我从 ...
- 熵权法原理及matlab代码实现
参考原理博客地址https://blog.csdn.net/u013713294/article/details/53407087 一.基本原理 在信息论中,熵是对不确定性的一种度量.信息量越大,不确 ...
- 洛谷P1579.验证哥德巴赫猜想(DFS+素性测试)
题目背景 1742年6月7日哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于9的奇数都可以表示成3个质数之和.质数是指除了1和本身之外没有其他约数的数,如2和11都是质数,而6不是 ...
- android.content.res.Resources$NotFoundException: String resource ID #0xb
原代码: protected void convert(BaseViewHolder helper, Student item) { helper.setText(R.id.item_tv_realm ...
- Kubernetes 的层级命名空间介绍
原文链接:https://fuckcloudnative.io/posts/introducing-hierarchical-namespaces/ 在单个 Kubernetes 集群上安全托管大量用 ...
- NOSQL基础
一.mongoDB介绍和使用 1.分布式文件储存数据库,使用C++开发的,可以存储任意数据(文件),允许在服务器端执行脚本,使用JSON形式储存数据{key:value} 2.支持的编程语言有:PHP ...
- 笔记:CSS基础
一.CSS(层叠式样式表),决定页面怎么显示元素 1.引入方式: 行内样式,在当前标签元素中直接使用 style 的属性. 内嵌方式,在<head>中写样式: 外链式,<link&g ...
- Jmeter 常用函数(31)- 详解 __iterationNum
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 获取当前线程的循环次数,跟线程组属性挂 ...
- Linux之lldptool工具
1. 描述当我们想在操作系统里面查看网口和交换机连接的状态信息,我们可以使用lldptool这个工具2.LLDP协议LLDP是Link Layer Discovery Protocol 链路层发现协议 ...