165 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}