最初通过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. 2018.9.8 2018NOIP冲刺之配对

    普及组第四题难度 主体思路竟然是贪心Q_Q 链接:https://www.nowcoder.com/acm/contest/164/D来源:牛客网 题目描述 小A有n个长度都是L的字符串.这些字符串只 ...

  2. 从同步原语看非阻塞同步以及Java中的应用

    非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略 ...

  3. HDU 1074:Doing Homework(状压DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=1074 Doing Homework Problem Description Ignatius has just ...

  4. html select 可输入 可编辑

    <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=gb2312'> ...

  5. Linux虚拟机怎么添加磁盘?

    一.VMware workstation菜单栏

  6. 简书全站爬取 mysql异步保存

    # 简书网 # 数据保存在mysql中; 将selenium+chromedriver集成到scrapy; 整个网站数据爬取 # 抓取ajax数据 #爬虫文件 # -*- coding: utf-8 ...

  7. 关于网页授权access_token和普通access_token的区别

    关于网页授权access_token和普通access_token的区别 1.微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授 ...

  8. ~~Py2&Py3~~

    进击のpython python2 整型 int -- long(长整型) /获取的是整数 python3 整型 int /获取的是浮点数(小数) python2 print(range(1,10)) ...

  9. C语言指针专题——使用指针要注意这些

    本文为原创,欢迎转发: 欢迎关注微博与微信号:C语言编程技术分享 C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题.在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中 ...

  10. 使用C#调试Windows服务模板项目

    Windows服务是非常强大的应用程序,可用于在backgorund中执行许多不同类型的任务.他们可以在不需要任何用户登录的情况下启动,并且可以使用除登录用户之外的其他用户帐户运行.但是,如果通过遵循 ...