165 lines
4.4 KiB
C#
165 lines
4.4 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using UnityEngine;
|
||
using UnityEngine.Networking;
|
||
|
||
public class TimeChecker : MonoBehaviour
|
||
{
|
||
// 设置的参考时间
|
||
public DateTime targetTime;
|
||
|
||
// 最大重试次数
|
||
public int maxRetries = 3;
|
||
|
||
// 当前重试次数
|
||
private int currentRetry = 0;
|
||
|
||
public Action actionA;
|
||
public Action actionB;
|
||
public Action actionC;
|
||
/// <summary>
|
||
/// 开始检查网络时间并执行相应逻辑
|
||
/// </summary>
|
||
public void CheckNetworkTimeAndExecute()
|
||
{
|
||
currentRetry = 0;
|
||
StartCoroutine(TryGetNetworkTime());
|
||
}
|
||
|
||
private IEnumerator TryGetNetworkTime()
|
||
{
|
||
// 时间服务器列表
|
||
string[] timeServers = new string[]
|
||
{
|
||
"http://www.ntp.org/",
|
||
"https://www.baidu.com",
|
||
"https://www.google.com",
|
||
"https://time.is/",
|
||
"https://www.microsoft.com"
|
||
};
|
||
|
||
foreach (string server in timeServers)
|
||
{
|
||
using (UnityWebRequest www = UnityWebRequest.Get(server))
|
||
{
|
||
www.SetRequestHeader("Cache-Control", "no-cache");
|
||
www.timeout = 8;
|
||
|
||
yield return www.SendWebRequest();
|
||
|
||
if (www.result == UnityWebRequest.Result.Success)
|
||
{
|
||
string dateHeader = www.GetResponseHeader("Date");
|
||
if (!string.IsNullOrEmpty(dateHeader))
|
||
{
|
||
if (TryParseDate(dateHeader, out DateTime networkTime))
|
||
{
|
||
DateTime localTime = networkTime.ToLocalTime();
|
||
Debug.Log($"成功获取网络时间: {localTime:yyyy-MM-dd HH:mm:ss}");
|
||
ProcessTimeComparison(localTime);
|
||
yield break;
|
||
}
|
||
else
|
||
{
|
||
Debug.LogWarning($"无法解析时间格式: {dateHeader}");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogWarning($"服务器 {server} 未返回Date头信息");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Debug.LogWarning($"请求 {server} 失败: {www.error}");
|
||
}
|
||
}
|
||
}
|
||
|
||
// 所有服务器尝试失败,进行重试
|
||
currentRetry++;
|
||
if (currentRetry < maxRetries)
|
||
{
|
||
Debug.Log($"重试获取网络时间 ({currentRetry}/{maxRetries})");
|
||
yield return new WaitForSecondsRealtime(2f * currentRetry);
|
||
StartCoroutine(TryGetNetworkTime());
|
||
}
|
||
else
|
||
{
|
||
//Debug.LogError("所有尝试都失败,无法获取网络时间");
|
||
// 时间获取失败,执行C逻辑
|
||
ExecuteLogicC();
|
||
}
|
||
}
|
||
|
||
// 尝试多种格式解析日期
|
||
private bool TryParseDate(string dateString, out DateTime dateTime)
|
||
{
|
||
string[] formats = {
|
||
"r",
|
||
"ddd, dd MMM yyyy HH:mm:ss GMT",
|
||
"dddd, dd-MMM-yy HH:mm:ss GMT",
|
||
"yyyy-MM-dd HH:mm:ss",
|
||
"ddd MMM dd HH:mm:ss yyyy"
|
||
};
|
||
|
||
return DateTime.TryParseExact(
|
||
dateString,
|
||
formats,
|
||
CultureInfo.InvariantCulture,
|
||
DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal,
|
||
out dateTime
|
||
);
|
||
}
|
||
|
||
// 处理时间比较
|
||
private void ProcessTimeComparison(DateTime networkTime)
|
||
{
|
||
Debug.Log($"设置的目标时间: {targetTime:yyyy-MM-dd HH:mm:ss}");
|
||
Debug.Log($"网络时间(本地): {networkTime:yyyy-MM-dd HH:mm:ss}");
|
||
|
||
if (networkTime <= targetTime)
|
||
{
|
||
ExecuteLogicA();
|
||
}
|
||
else
|
||
{
|
||
ExecuteLogicB();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 逻辑A:当前时间小于等于设置时间时执行
|
||
/// </summary>
|
||
private void ExecuteLogicA()
|
||
{
|
||
actionA?.Invoke();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 逻辑B:当前时间大于设置时间时执行
|
||
/// </summary>
|
||
private void ExecuteLogicB()
|
||
{
|
||
actionB?.Invoke();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 逻辑C:时间获取失败时执行
|
||
/// </summary>
|
||
private void ExecuteLogicC()
|
||
{
|
||
actionC?.Invoke();
|
||
}
|
||
|
||
// 示例调用
|
||
private void OnEnable()
|
||
{
|
||
// 设置目标时间示例
|
||
targetTime = new DateTime(2025,10,1);
|
||
CheckNetworkTimeAndExecute();
|
||
}
|
||
}
|