Unity 发送http请求获取网络时间

Unity 发送http请求获取网络时间

GetTimeFromWorldtimeapiCoroutineGetTimeFromWorldtimeapi 可能会超时!

实现方式,GetTimeFromBaidu GetTimeFromBaiduCoroutine 是从请求头中分离出时间,有Unitask和 协程版本
在这里插入图片描述

GetTimeFromWorldtimeapiGetTimeFromWorldtimeapiCoroutine 是发送请求,从得到的字符串中解析出时间 ,有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"
        };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值