最初通过qq时间服务器获得时间,经常出现有网络也获取失败的情况。
后面寻找解决办法,查找资料终于发现通过ntp时间服务器获取网络时间的方法。
 
首先游戏开始获得初始化网络时间,通常只获取一次,其他时间获取时间通过本地时间差加上初始网络时间获得当前时间。
GetCurrentTime()获取当前时间,GetDay()获得当前天数整点。
 
代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Net;
using System.Net.Sockets; namespace NTP
{
public class NetworkTime { private static NetworkTime instance; private static readonly object locker = new object(); private NetworkTime(){
} public static NetworkTime GetInstance(){
if (instance == null) {
lock (locker) {
if (instance == null) {
instance = new NetworkTime ();
}
}
} return instance;
} public void InitTime(){
GetNetworkTime ();
}
public string TIME_SERVER_URL = "ntp7.aliyun.com";
public DateTime initTime,initLocalTime;
public static DateTime InsteadLocalTime;
public static string InsteadLocalTime_st;
public DateTime GetNetworkTime()
{ try
{
//ntp服务器地址
string server = TIME_SERVER_URL; var ntpData = new byte[];
ntpData[] = 0x1B;
//网络链接
var addresses = Dns.GetHostEntry(server).AddressList;
var ipEndPoint = new IPEndPoint(addresses[], ); // https port : 443
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.ReceiveTimeout = ;
socket.Connect(ipEndPoint);
socket.Send(ntpData);
socket.Receive(ntpData);
socket.Close(); ulong intPart = (ulong)ntpData[] << | (ulong)ntpData[] << | (ulong)ntpData[] << | (ulong)ntpData[];
ulong fractPart = (ulong)ntpData[] << | (ulong)ntpData[] << | (ulong)ntpData[] << | (ulong)ntpData[]; var milliseconds = (intPart * ) + ((fractPart * ) / 0x100000000L);
var networkDataTime = (new DateTime(, , , , , , DateTimeKind.Local)).AddMilliseconds((long)milliseconds); TimeZone localzone = TimeZone.CurrentTimeZone;
TimeSpan currentOffset = localzone.GetUtcOffset(networkDataTime);
initTime = networkDataTime + currentOffset;
initLocalTime = DateTime.Now;
Debug.Log("steve" + initTime.ToString());
return initTime; }
catch
{ InsteadLocalTime = DateTime.UtcNow; TimeZone localzone_ = TimeZone.CurrentTimeZone;
TimeSpan currentOffset_ = localzone_.GetUtcOffset(DateTime.UtcNow);
initTime = DateTime.UtcNow + currentOffset_;//기준 시에 +,- 로컬과 시간차이 더하면 현지로컬시간이 나옴!
return initTime; } } public DateTime GetDay(int day = ){ return GetCurrentTime().AddDays(day).Date;
} public DateTime GetCurrentTime(){
DateTime d = DateTime.Now;
return initTime + (d - initLocalTime);
} public void CompareGameTime(){
//时间的比较,一般用于连续签到系统等
string SavedAfterDayTime = PlayerPrefs.GetString("SavedAfterDayTime", "11/30/2018 00:00:00 AM");
//转化成第一个时间点(即领取后的第一天)
DateTime SavedAfterDayTime_T = Convert.ToDateTime(SavedAfterDayTime);
//当前时间与时间点相比较,当前时间超过存档钱则等于1,相等则等于0,当前时间未超过存档点的时间则等于-1
int compare1 = DateTime.Compare(GetDay(), SavedAfterDayTime_T.Date); if(compare1 < ){
//开启倒计时
}else if(compare1 == ){
//待领取,计时器结束
}else{
//重置状态 } } }
}

Unity通过NTP获取网络时间的更多相关文章

  1. java 通过网络 ntp 获取网络时间

    需要 commons-net-3.4.jar 库. import org.apache.commons.net.ntp.NTPUDPClient; import org.apache.commons. ...

  2. ESP8266- 使用AT指令获取网络时间

    前言:很早就考虑过用 ESP8266 获取网络时间,以前都是用 ESP8266 刷机智云的 Gagent 固件,但无奈现在手头的 ESP-01 的 Flash 只有 1M,实在无法胜任.经过在网络上的 ...

  3. python获取网络时间和本地时间

    今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  4. Lua获取网络时间

    作者:ani_di  版权所有,转载务必保留此链接 http://blog.csdn.net/ani_di Lua获取网络时间 网络授时服务是一些网络上的时间服务器提供的时间,一般用于本地时钟同步. ...

  5. QT+VS2013 * 获取网络时间

    使用qt函数获取网络时间 现在Qt Project Setting中的Qt Modules勾选NetWork,再导入头文件我也忘了叫什么了 QStringList net_time; QTcpSock ...

  6. Android获取网络时间的方法

    一.通过免费或者收费的API接口获取 1.免费 QQ:http://cgi.im.qq.com/cgi-bin/cgi_svrtime 淘宝:http://api.m.taobao.com/rest/ ...

  7. iOS获取网络时间与转换格式

      [NSDate date]可以获取系统时间,但是会造成一个问题,用户可以自己修改手机系统时间,所以有时候需要用网络时间而不用系统时间.获取网络标准时间的方法: 1.先在需要的地方实现下面的代码,创 ...

  8. NTP同步网络时间

    为什么要同步网络时间呢,这是由于树莓派没有RTC和后备电池,不能像PC机那样关机之后仍可以走时. NTP对时步骤: 1 安装ntpdate sudo apt-get install ntpdate s ...

  9. linux C++通过ntp协议获取网络时间

    转自:http://blog.csdn.net/ccjjyy/article/details/42871993 #include <stdio.h> #include <sys/ty ...

随机推荐

  1. Codeforces Gym101246G:Revolutionary Roads(DFS+思维)

    http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...

  2. mongo创建集合

    查询 db.getCollection('tbTrade').find({strDealSN:'P2P0_153596710bb00010011ba47b342'}); 更新(第一个{}为条件) db ...

  3. java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...

  4. maven多仓库配置(公司服务器与阿里云仓库)

    1. 问题描述 公司内网搭建的有maven私有服务器,但是碰到好几次只有gav没有jar的情况或者最新版本更新不及时,所以需要公司服务器和远程仓库(阿里云)相结合来满足项目需求. 2. 解决方案: m ...

  5. Bzoj 1537: [POI2005]Aut- The Bus 题解 [由暴力到正解]

    1537: [POI2005]Aut- The Bus Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 387  Solved: 264[Submit][S ...

  6. v8环境搭建采坑记录

    项目组有把js接入C++服务求的需求,故开始了v8接入的工作,用了一天多时间,v8才在centos环境上成功安装,过程中踩了很多坑,下面将采坑过程记录如下: centos下编译安装v8:   查看ce ...

  7. I/O:FileLock

    FileLock: /* 文件锁定要么是独占的,要么是共享的.共享锁定可阻止其他并发运行的程序获取重叠的 独占锁定,但是允许该程序获取重叠的共享锁定.独占锁定则阻止其他程序获取任一类型的重叠锁 定.一 ...

  8. 【CYH-02】NOIp考砸后虐题赛:成绩:题解

    这道题挺送水了吧... 两种做法. 其实空间都不需要那么大,我来提交界面一看一堆MLE的,于是还是良心的放开了时限. 这么简单,就不做解释了. 下面放出几种代码. 代码: 两个数组: #include ...

  9. kafka学习(二)-------- 什么是Kafka

    通过Kafka的快速入门 https://www.cnblogs.com/tree1123/p/11150927.html 能了解到Kafka的基本部署,使用,但他和其他的消息中间件有什么不同呢? K ...

  10. Node.js socket 双向通信

    使用场景:  聊天室:大量数据常驻交互: 技术栈: Node.js,     Vue.js || 原生JS 服务端代码: const app = require('http').createServe ...