最初通过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. yarn or npm 版本固化如何选择

    前言 作为前端开发者,npm这个包管理工具的重要性显而易见.优点不再表述,但一些缺点是为使用者诟病比较多的:速度慢.版本控制.下面主要讨论下npm的版本固化问题,即lock文件. npm语义化版本管理 ...

  2. UVALive 7037:The Problem Needs 3D Arrays(最大密度子图)

    题目链接 题意 给出n个点,每个点有一个值,现在要选择一些点的集合,使得(选择的点生成的逆序对数目)/(选择的点的数量)的比率最大. 思路 点与点之间生成一个逆序对可以看做是得到一个边,那么就是分数规 ...

  3. UAVStack的慢SQL数据库监控功能及其实现

    UAVStack是一个全维监控与应用运维平台.UAV.Monitor具备监控功能,包含基础监控.应用/服务性能监控.日志监控.业务监控等.在应用监控中,UAV可以根据应用实例画像:其中应用实例组件可以 ...

  4. C# “从元数据”

    所谓元数据.其实是指由微软所封装的类..这些类你可以查看.但是无法修改. 元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译 ...

  5. 我在生产项目里是如何使用Redis发布订阅的?(二)Java版代码实现(含源码)

    上篇文章讲了在实际项目里的哪些业务场景用到Redis发布订阅,这篇文章就讲一下,在Java中如何实现的. 图解代码结构 发布订阅的理论以及使用场景大家都已经有了大致了解了,但是怎么用代码实现发布订阅呢 ...

  6. Azkaban Condition Flow (条件工作流) 使用简介

    本文上接<Azkaban Flow 2.0 使用简介>,对Azkaban Condition Flow (条件工作流) 做简单介绍 目录 目录 条件工作流 介绍 作用 使用方式 支持的运算 ...

  7. Jenkins构建部署jar/war后,服务无法在后台持续运行的解决方案

    jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务.jenkins构建后,手动执行sh脚本,服务启动异常.但jenkins结合shel ...

  8. 分享几个能用的editplus注册码/2018年序列号

    注册名:host1991 序列号:14F50-CD5C8-E13DA-51100-BAFE6     注册名:360xw    注册码:93A52-85B80-A3308-BF130-40412   ...

  9. spring mvc 拦截器的使用

    Spring MVC 拦截器的使用 拦截器简介 Spring MVC 中的拦截器(Interceptor)类似于 Servler 中的过滤器(Filter).用于对处理器进行预处理和后处理.常用于日志 ...

  10. mac 部署安装接口自动化持续集成 jmeter+ant+jenkins

    由于前段时间刚换的工作,公司用的是mac电脑办公,之前办公都是windows系统.刚开始使用时连基本的操作都要去找度娘,很不习惯,新电脑开始就是安装相关的工作工具 下面就说说遇到的哪些坑. 1.  m ...