NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/Common/CrossDayChecker.cs

125 lines
3.4 KiB
C#

using System;
using PhxhSDK;
using Framework;
public class CrossDayChecker : Singlenton<CrossDayChecker>, IUpdatable, IInitable
{
// 检查时间点
private static readonly TimeSpan CheckPointTime =
new TimeSpan(5, 0, 0);
// 记录上次检查的时间
private DateTime lastCheckTime;
public void Update(float deltaTime)
{
DateTime now = DateTime.Now;
// 检测跨天
if (HasCrossedDay(lastCheckTime, now))
{
DebugUtil.Log("跨天了!");
EventManager.Instance.Send(EventManager.EventName.CrossDay);
}
// 检测跨周
if (HasCrossedWeek(lastCheckTime, now))
{
DebugUtil.Log("跨周了!");
EventManager.Instance.Send(EventManager.EventName.CrossWeek);
}
// 检测跨月
if (HasCrossedMonth(lastCheckTime, now))
{
DebugUtil.Log("跨月了!");
EventManager.Instance.Send(EventManager.EventName.CrossMonth);
}
// 更新 lastCheckTime
lastCheckTime = now;
}
public void Init()
{
lastCheckTime = DateTime.Now;
}
public void Release()
{
}
/// <summary>
/// 检测是否跨天
/// </summary>
private bool HasCrossedDay(DateTime previousTime, DateTime currentTime)
{
var currentCrossTime = GetCrossTime(currentTime);
return currentTime >= currentCrossTime && previousTime < currentCrossTime;
}
/// <summary>
/// 检测是否跨周
/// </summary>
private bool HasCrossedWeek(DateTime previousTime, DateTime currentTime)
{
var previousCrossTime = GetCrossTime(previousTime).StartOfWeek();
var currentCrossTime = GetCrossTime(currentTime).StartOfWeek();
return currentCrossTime > previousCrossTime && currentTime >= currentCrossTime;
}
/// <summary>
/// 检测是否跨月
/// </summary>
private bool HasCrossedMonth(DateTime previousTime, DateTime currentTime)
{
var previousCrossTime = GetCrossTime(previousTime).StartOfMonth();
var currentCrossTime = GetCrossTime(currentTime).StartOfMonth();
return currentCrossTime > previousCrossTime && currentTime >= currentCrossTime;
}
/// <summary>
/// 获取指定时间的检查点时间
/// </summary>
private DateTime GetCrossTime(DateTime date)
{
var crossTime = date.Date + CheckPointTime;
if (date.TimeOfDay < CheckPointTime)
{
crossTime = crossTime.AddDays(-1);
}
return crossTime;
}
}
/// <summary>
/// DateTime 的扩展方法
/// </summary>
public static class DateTimeExtensions
{
/// <summary>
/// 获取指定日期所在周的起始时间(以跨天时间点为准)
/// </summary>
public static DateTime StartOfWeek(this DateTime date)
{
// 周一为一周的起始
var diff = (int)date.DayOfWeek - (int)DayOfWeek.Monday;
if (diff < 0)
{
diff += 7;
}
return date.AddDays(-diff).Date;
}
/// <summary>
/// 获取指定日期所在月的起始时间(以跨天时间点为准)
/// </summary>
public static DateTime StartOfMonth(this DateTime date)
{
return new DateTime(date.Year, date.Month, 1);
}
}