Unity 发送http请求获取网络时间
GetTimeFromWorldtimeapiCoroutine 与 GetTimeFromWorldtimeapi 可能会超时!
实现方式,GetTimeFromBaidu 与GetTimeFromBaiduCoroutine 是从请求头中分离出时间,有Unitask和 协程版本

GetTimeFromWorldtimeapi 与 GetTimeFromWorldtimeapiCoroutine 是发送请求,从得到的字符串中解析出时间 ,有Unitask和 协程版本

示例代码
using UnityEngine;
/// <summary>
/// 场景启动
/// </summary>
public class GameLanch : MonoBehaviour
{
// 提供当前时间的公共 API
private string host = "www.baidu.com";
private float timeout = 2.0f; // 超时时间 2 秒
private async void Awake()
{
gameObject.name = nameof(GameLanch);
//使用unitask 异步获取
//百度
string baiduTime = await NetworkTime.GetTimeFromBaidu();
Debug.Log("Baidu Time: " + baiduTime);
// Worldtimeapi 可能会超时!
string worldTimeApiTime = await NetworkTime.GetTimeFromWorldtimeapi();
Debug.Log("WorldTimeAPI Time: " + worldTimeApiTime);
// 启动协程来获取百度时间
StartCoroutine(NetworkTime.GetTimeFromBaiduCoroutine((time) =>
{
Debug.Log("Baidu Time: " + time);
}));
// 启动协程来获取世界时间 API 时间 可能会超时!
StartCoroutine(NetworkTime.GetTimeFromWorldtimeapiCoroutine((time) =>
{
Debug.Log("WorldTimeAPI Time: " + time);
}));
}
}
请求代码
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
using System;
using System.Globalization;
using System.Collections;
using System.Collections.Generic;
public static class NetworkTime
{
private static string baiduHost = "www.baidu.com";
private static string worldTimeApiUrl = "http://worldtimeapi.org/api/timezone/Asia/Shanghai";
private static float timeout = 2.0f; // 超时时间 2 秒
/// <summary>
/// 从百度获取时间
/// </summary>
/// <returns></returns>
public static async UniTask<string> GetTimeFromBaidu()
{
DateTime startTime = DateTime.Now;
UnityWebRequest request = UnityWebRequest.Get("http://" + baiduHost);
// 启动请求
var asyncOperation = request.SendWebRequest();
// 等待请求完成或超时
while (!asyncOperation.isDone)
{
if ((DateTime.Now - startTime).TotalSeconds >= timeout)
{
Debug.Log("Request timed out after 2 seconds.");
return FormatTime(DateTime.Now);
}
await UniTask.Yield();
}
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error: " + request.error);
return FormatTime(DateTime.Now);
}
else
{
// 从响应头中获取日期时间字符串
string ts = request.GetResponseHeader("date");
// 解析日期时间字符串,格式为 "Tue, 12 Oct 2023 12:34:56 GMT"
DateTime ltime = DateTime.ParseExact(ts, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture);
// 将解析后的时间转换为本地时间(北京时间)
DateTime ttime = ltime.AddHours(8);
// 返回格式化后的网络时间
return FormatTime(ttime);
}
}
/// <summary>
/// 向Worldtimeapi 发送请求获取时间,可能会失效
/// </summary>
/// <returns></returns>
public static async UniTask<string> GetTimeFromWorldtimeapi()
{
DateTime startTime = DateTime.Now;
UnityWebRequest request = UnityWebRequest.Get(worldTimeApiUrl);
// 启动请求
var asyncOperation = request.SendWebRequest();
// 等待请求完成或超时
while (!asyncOperation.isDone)
{
if ((DateTime.Now - startTime).TotalSeconds >= timeout)
{
Debug.Log("Request timed out after 2 seconds.");
return FormatTime(DateTime.Now);
}
await UniTask.Yield();
}
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error: " + request.error);
return FormatTime(DateTime.Now);
}
else
{
// 解析 JSON 响应
string jsonResponse = request.downloadHandler.text;
WorldTimeResponse timeResponse = JsonUtility.FromJson<WorldTimeResponse>(jsonResponse);
// 返回格式化后的网络时间
return FormatTime(timeResponse.datetime);
}
}
private static string FormatTime(DateTime time)
{
return time.ToString("yyyyMMdd HH:mm:ss");
}
private static string FormatTime(string time)
{
DateTime dateTime = DateTime.Parse(time);
return dateTime.ToString("yyyyMMdd HH:mm:ss");
}
public static IEnumerator GetTimeFromBaiduCoroutine(Action<string> callback)
{
DateTime startTime = DateTime.Now;
UnityWebRequest request = UnityWebRequest.Get("http://" + baiduHost);
// 启动请求
var asyncOperation = request.SendWebRequest();
// 等待请求完成或超时
while (!asyncOperation.isDone)
{
if ((DateTime.Now - startTime).TotalSeconds >= timeout)
{
Debug.Log("Request timed out after 2 seconds.");
callback(FormatTime(DateTime.Now));
yield break;
}
yield return null;
}
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error: " + request.error);
callback(FormatTime(DateTime.Now));
}
else
{
// 从响应头中获取日期时间字符串
string ts = request.GetResponseHeader("date");
// 解析日期时间字符串,格式为 "Tue, 12 Oct 2023 12:34:56 GMT"
DateTime ltime = DateTime.ParseExact(ts, "ddd, dd MMM yyyy HH:mm:ss 'GMT'", CultureInfo.InvariantCulture);
// 将解析后的时间转换为本地时间(北京时间)
DateTime ttime = ltime.AddHours(8);
// 返回格式化后的网络时间
callback(FormatTime(ttime));
}
}
public static IEnumerator GetTimeFromWorldtimeapiCoroutine(Action<string> callback)
{
DateTime startTime = DateTime.Now;
UnityWebRequest request = UnityWebRequest.Get(worldTimeApiUrl);
// 启动请求
var asyncOperation = request.SendWebRequest();
// 等待请求完成或超时
while (!asyncOperation.isDone)
{
if ((DateTime.Now - startTime).TotalSeconds >= timeout)
{
Debug.Log("Request timed out after 2 seconds.");
callback(FormatTime(DateTime.Now));
yield break;
}
yield return null;
}
if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
{
Debug.LogError("Error: " + request.error);
callback(FormatTime(DateTime.Now));
}
else
{
// 解析 JSON 响应
string jsonResponse = request.downloadHandler.text;
WorldTimeResponse timeResponse = JsonUtility.FromJson<WorldTimeResponse>(jsonResponse);
// 返回格式化后的网络时间
callback(FormatTime(timeResponse.datetime));
}
}
}
[System.Serializable]
public class WorldTimeResponse
{
public string abbreviation;
public string client_ip;
public string datetime;
public int day_of_week;
public int day_of_year;
public bool dst;
public string dst_from;
public int dst_offset;
public string dst_until;
public int raw_offset;
public string timezone;
public int unixtime;
public string utc_datetime;
public string utc_offset;
public int week_number;
}
如果想雨露均沾
可以做一个随机,然后随机访问国内的某个公司的域名
/// <summary>
/// 一些公司的域名
/// </summary>
public static List<string> CompanyDomains = new List<string>
{
"www.sina.com.cn",
"www.163.com",
"www.tencent.com",
"www.mi.com",
"www.baidu.com",
"www.meituan.com",
"www.didiglobal.com",
"www.youkuaiyun.com",
"leetcode.com",
"www.lenovo.com",
"www.hp.com",
"www.asus.com",
"www.msi.com",
"www.douyin.com",
"www.kuaishou.com",
"www.alipay.com",
"www.taobao.com",
"www.huxiu.com",
"www.zhihu.com",
"www.jd.com",
"www.bilibili.com",
"www.sogou.com",
"www.chinaunicom.com.cn",
"www.chinatelecom.com.cn",
"www.10086.cn"
};
3362

被折叠的 条评论
为什么被折叠?



