最初通过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. Flutter学习笔记(3)--Dart变量与基本数据类型

    一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...

  2. leadcode的Hot100系列--62. 不同路径--简单的动态规划

    题目比较清晰,简单来说就是: A B C D E F G H I J K L 只能往右或者往下,从A到L,能有几种走法. 这里使用动态规划的方法来做一下. 动态规划最重要的就是动态方程,这里简单说下这 ...

  3. Spring Bean 生命周期之destroy——终极信仰

    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...

  4. easyui 使用jquery动态添加组件样式问题

    可以使用$.parser.parse();这个方法进行处理: 例如:   $.parser.parse(); 表示对整个页面重新渲染,渲染完就可以看到easyui原来的样式了:   var targe ...

  5. 再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三(走过路过不要错过)

    Gitlab runner 快速搭建CICD pipeline 背景 日常开发中,相信大家已经做了很多的自动化运维环境,用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包,部署 ...

  6. Ubuntu系统 apt-get update失败解决办法

    使用apt-get的时候发现ubuntu和阿里云均已经不提供该版本的源,所以需要找到其他的替代源. 使用的ubuntu版本是14.10,属于非LTS(长期支持版本),因此前一段时间还可以使用apt-g ...

  7. java中几个常见的问题

    1.正确使用equals方法 Object的equals方法容易抛出空指针异常,应使用常量或确定有值的对象来调用equals方法 例如: //不能使用一个值为null的引用类型变量来调用非静态方法,否 ...

  8. 前后端分离之Swagger2

    1. 问题描述 随着软件过程的不断发展,前后端分离开发模式被越来越的开发团队使用,今天介绍下前后分离中必用的接口设计与调试工具-swagger2,前端人员根据swagger的描述,进行参数的传递:前后 ...

  9. kuangbin专题专题四 Heavy Transportation POJ - 1797

    题目链接:https://vjudge.net/problem/POJ-1797 思路:请参考我列出的另一个题目,和这个题目要求的值相反,另一个清楚后,这个写的解释就明白了. 另一个类似题目的博客:h ...

  10. Python入门基础(7)

    这一篇来介绍一下函数里面的一些东西 函数的参数 必须参数:必须参数必须以正确的顺序传入函数.调用时的数据必须和声明时的一样 如果根据参数名来传入参数值,则无须遵守定义形参的顺序,这种方式被称为关键字( ...