com.alicizax.unity/Runtime/Helper/TimerHelper.cs
2025-03-24 13:16:51 +08:00

267 lines
8.2 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;
namespace AlicizaX
{
/// <summary>
/// 游戏时间帮助类
/// </summary>
public static class TimerHelper
{
private static readonly DateTime EpochTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
private static readonly long Epoch = EpochTime.Ticks;
/// <summary>
/// 时间差
/// </summary>
private static long _differenceTime;
private static bool _isSecLevel = true;
/// <summary>
/// 微秒
/// </summary>
public const long TicksPerMicrosecond = 1; //100微秒
/// <summary>
/// 10微秒
/// </summary>
public const long TicksPer = 10 * TicksPerMicrosecond;
/// <summary>
/// 1毫秒
/// </summary>
public const long TicksMillisecondUnit = TicksPer * 1000; //毫秒
/// <summary>
/// 1秒
/// </summary>
public const long TicksSecondUnit = TicksMillisecondUnit * 1000; // 秒 //10000000
/// <summary>
/// 设置时间差
/// </summary>
/// <param name="timeSpan"></param>
[UnityEngine.Scripting.Preserve]
public static void SetDifferenceTime(long timeSpan)
{
if (timeSpan > 1000000000000)
{
_isSecLevel = false;
}
else
{
_isSecLevel = true;
}
if (_isSecLevel)
{
_differenceTime = timeSpan - ClientNow();
}
else
{
_differenceTime = timeSpan - ClientNowMillisecond();
}
}
/// <summary>
/// 毫秒级
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long ClientNowMillisecond()
{
return (DateTime.UtcNow.Ticks - Epoch) / TicksMillisecondUnit;
}
[UnityEngine.Scripting.Preserve]
public static long ServerToday()
{
if (_isSecLevel)
{
return _differenceTime + ClientToday();
}
return (_differenceTime + ClientTodayMillisecond()) / 1000;
}
[UnityEngine.Scripting.Preserve]
public static long ClientTodayMillisecond()
{
return (DateTime.Now.Date.ToUniversalTime().Ticks - Epoch) / 10000;
}
/// <summary>
/// 服务器当前时间
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long ServerNow() //秒级
{
if (_isSecLevel)
{
return _differenceTime + ClientNow();
}
return (_differenceTime + ClientNowMillisecond()) / 1000;
}
/// <summary>
/// 将秒数转换成TimeSpan
/// </summary>
/// <param name="seconds">秒</param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static TimeSpan FromSeconds(int seconds)
{
return TimeSpan.FromSeconds(seconds);
}
/// <summary>
/// 今天的客户端时间
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long ClientToday()
{
return (DateTime.Now.Date.ToUniversalTime().Ticks - Epoch) / TicksSecondUnit;
}
/// <summary>
/// 客户端时间,毫秒
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long ClientNow()
{
return (DateTime.UtcNow.Ticks - Epoch) / 10000;
}
/// <summary>
/// 客户端时间。秒
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long ClientNowSeconds()
{
return (DateTime.UtcNow.Ticks - Epoch) / 10000000;
}
/// <summary>
/// 客户端时间
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long Now()
{
return ClientNow();
}
/// <summary>
/// UTC时间 秒
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long UnixTimeSeconds()
{
return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
}
/// <summary>
/// UTC时间 毫秒
/// </summary>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long UnixTimeMilliseconds()
{
return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();
}
/// <summary>
/// 按照UTC时间判断两个时间戳是否是同一天
/// </summary>
/// <param name="timestamp1">时间戳1</param>
/// <param name="timestamp2">时间戳2</param>
/// <returns>是否是同一天</returns>
[UnityEngine.Scripting.Preserve]
public static bool IsUnixSameDay(long timestamp1, long timestamp2)
{
var time1 = UtcToUtcDateTime(timestamp1);
var time2 = UtcToUtcDateTime(timestamp2);
return time1.Date.Year == time2.Date.Year && time1.Date.Month == time2.Date.Month && time1.Date.Day == time2.Date.Day;
}
/// <summary>
/// 按照本地时间判断两个时间戳是否是同一天
/// </summary>
/// <param name="timestamp1">时间戳1</param>
/// <param name="timestamp2">时间戳2</param>
/// <returns>是否是同一天</returns>
[UnityEngine.Scripting.Preserve]
public static bool IsLocalSameDay(long timestamp1, long timestamp2)
{
var time1 = UtcToLocalDateTime(timestamp1);
var time2 = UtcToLocalDateTime(timestamp2);
return time1.Date.Year == time2.Date.Year && time1.Date.Month == time2.Date.Month && time1.Date.Day == time2.Date.Day;
}
/// <summary>
/// UTC 时间戳 转换成UTC时间
/// </summary>
/// <param name="utcTimestamp">UTC时间戳,单位秒</param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static DateTime UtcToUtcDateTime(long utcTimestamp)
{
return DateTimeOffset.FromUnixTimeSeconds(utcTimestamp).UtcDateTime;
}
/// <summary>
/// UTC 时间戳 转换成本地时间
/// </summary>
/// <param name="utcTimestamp">UTC时间戳,单位秒</param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static DateTime UtcToLocalDateTime(long utcTimestamp)
{
return DateTimeOffset.FromUnixTimeSeconds(utcTimestamp).LocalDateTime;
}
/// <summary>
/// 判断两个时间是否是同一天
/// </summary>
/// <param name="time1">时间1</param>
/// <param name="time2">时间2</param>
/// <returns>是否是同一天</returns>
[UnityEngine.Scripting.Preserve]
public static bool IsSameDay(DateTime time1, DateTime time2)
{
return time1.Date.Year == time2.Date.Year && time1.Date.Month == time2.Date.Month && time1.Date.Day == time2.Date.Day;
}
/// <summary>
/// 指定时间转换成Unix时间戳的时间差单位秒
/// </summary>
/// <param name="time">指定时间</param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long LocalTimeToUnixTimeSeconds(DateTime time)
{
var utcDateTime = time.ToUniversalTime();
return (long)(utcDateTime - EpochTime).TotalSeconds;
}
/// <summary>
/// 指定时间转换成Unix时间戳的时间差单位毫秒
/// </summary>
/// <param name="time">指定时间</param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static long LocalTimeToUnixTimeMilliseconds(DateTime time)
{
var utcDateTime = time.ToUniversalTime();
return (long)(utcDateTime - EpochTime).TotalMilliseconds;
}
}
}