using System; namespace AlicizaX { /// /// 游戏时间帮助类 /// 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; /// /// 时间差 /// private static long _differenceTime; private static bool _isSecLevel = true; /// /// 微秒 /// public const long TicksPerMicrosecond = 1; //100微秒 /// /// 10微秒 /// public const long TicksPer = 10 * TicksPerMicrosecond; /// /// 1毫秒 /// public const long TicksMillisecondUnit = TicksPer * 1000; //毫秒 /// /// 1秒 /// public const long TicksSecondUnit = TicksMillisecondUnit * 1000; // 秒 //10000000 /// /// 设置时间差 /// /// [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(); } } /// /// 毫秒级 /// /// [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; } /// /// 服务器当前时间 /// /// [UnityEngine.Scripting.Preserve] public static long ServerNow() //秒级 { if (_isSecLevel) { return _differenceTime + ClientNow(); } return (_differenceTime + ClientNowMillisecond()) / 1000; } /// /// 将秒数转换成TimeSpan /// /// 秒 /// [UnityEngine.Scripting.Preserve] public static TimeSpan FromSeconds(int seconds) { return TimeSpan.FromSeconds(seconds); } /// /// 今天的客户端时间 /// /// [UnityEngine.Scripting.Preserve] public static long ClientToday() { return (DateTime.Now.Date.ToUniversalTime().Ticks - Epoch) / TicksSecondUnit; } /// /// 客户端时间,毫秒 /// /// [UnityEngine.Scripting.Preserve] public static long ClientNow() { return (DateTime.UtcNow.Ticks - Epoch) / 10000; } /// /// 客户端时间。秒 /// /// [UnityEngine.Scripting.Preserve] public static long ClientNowSeconds() { return (DateTime.UtcNow.Ticks - Epoch) / 10000000; } /// /// 客户端时间 /// /// [UnityEngine.Scripting.Preserve] public static long Now() { return ClientNow(); } /// /// UTC时间 秒 /// /// [UnityEngine.Scripting.Preserve] public static long UnixTimeSeconds() { return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); } /// /// UTC时间 毫秒 /// /// [UnityEngine.Scripting.Preserve] public static long UnixTimeMilliseconds() { return new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds(); } /// /// 按照UTC时间判断两个时间戳是否是同一天 /// /// 时间戳1 /// 时间戳2 /// 是否是同一天 [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; } /// /// 按照本地时间判断两个时间戳是否是同一天 /// /// 时间戳1 /// 时间戳2 /// 是否是同一天 [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; } /// /// UTC 时间戳 转换成UTC时间 /// /// UTC时间戳,单位秒 /// [UnityEngine.Scripting.Preserve] public static DateTime UtcToUtcDateTime(long utcTimestamp) { return DateTimeOffset.FromUnixTimeSeconds(utcTimestamp).UtcDateTime; } /// /// UTC 时间戳 转换成本地时间 /// /// UTC时间戳,单位秒 /// [UnityEngine.Scripting.Preserve] public static DateTime UtcToLocalDateTime(long utcTimestamp) { return DateTimeOffset.FromUnixTimeSeconds(utcTimestamp).LocalDateTime; } /// /// 判断两个时间是否是同一天 /// /// 时间1 /// 时间2 /// 是否是同一天 [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; } /// /// 指定时间转换成Unix时间戳的时间差,单位秒 /// /// 指定时间 /// [UnityEngine.Scripting.Preserve] public static long LocalTimeToUnixTimeSeconds(DateTime time) { var utcDateTime = time.ToUniversalTime(); return (long)(utcDateTime - EpochTime).TotalSeconds; } /// /// 指定时间转换成Unix时间戳的时间差,单位毫秒 /// /// 指定时间 /// [UnityEngine.Scripting.Preserve] public static long LocalTimeToUnixTimeMilliseconds(DateTime time) { var utcDateTime = time.ToUniversalTime(); return (long)(utcDateTime - EpochTime).TotalMilliseconds; } } }