修改跨天检测方法

main
zhangaotian 2025-04-09 18:33:21 +08:00
parent d4af337095
commit 876636fb53
1 changed files with 24 additions and 4 deletions

View File

@ -14,7 +14,10 @@ public class CrossDayChecker : Singlenton<CrossDayChecker>, IUpdatable, IInitabl
// 记录上次检查的时间
private DateTime lastCheckTime;
// 服务器时间与本地时间的差值(毫秒)
private long serverTimeOffset;
private bool _init;
public bool disableCheck = false;
@ -27,7 +30,9 @@ public class CrossDayChecker : Singlenton<CrossDayChecker>, IUpdatable, IInitabl
{
if (!_init) return;
if (disableCheck) return;
var now = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
// 使用本地时间加上差值计算服务器时间,避免频繁网络请求
var now = GetEstimatedServerTime();
// 检测跨天
if (HasCrossedDay(lastCheckTime, now))
@ -55,8 +60,15 @@ public class CrossDayChecker : Singlenton<CrossDayChecker>, IUpdatable, IInitabl
public void InitForLoginOk()
{
// 从配置中获取跨天时间点
checkPointTime = new TimeSpan(GLConfig.Inst.data.DailyChangeHour, 0, 0);
// 初始化时计算服务器时间与本地时间的差值
DateTime serverTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
DateTime localTime = DateTime.Now;
serverTimeOffset = (long)(serverTime - localTime).TotalMilliseconds;
DebugUtil.Log($"CrossDayChecker: 服务器时间偏移量:{serverTimeOffset}毫秒");
if (PlayerPrefs.HasKey("CrossDayChecker_LastCheckTime"))
{
string savedTime = PlayerPrefs.GetString("CrossDayChecker_LastCheckTime");
@ -68,19 +80,27 @@ public class CrossDayChecker : Singlenton<CrossDayChecker>, IUpdatable, IInitabl
else
{
DebugUtil.Log("CrossDayChecker: 无法解析存储的时间,使用当前服务器时间作为初始化时间。");
lastCheckTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
lastCheckTime = serverTime;
SendAllCrossEvent();
}
}
else
{
DebugUtil.Log("CrossDayChecker: 本地存储中未找到上次检查时间,使用当前服务器时间作为初始化时间。");
lastCheckTime = CommonUtils.GetCurTime(CommonUtils.E_TimeType.Server);
lastCheckTime = serverTime;
SendAllCrossEvent();
}
_init = true;
}
/// <summary>
/// 根据本地时间和时间偏移量估算服务器时间
/// </summary>
private DateTime GetEstimatedServerTime()
{
return DateTime.Now.AddMilliseconds(serverTimeOffset);
}
/// <summary>
/// 检测是否跨天