| using System; | 
| using System.Text; | 
| using UnityEngine; | 
|   | 
| public static class TimeUtility | 
| { | 
|     private static DateTime s_ServerTime = DateTime.Now; | 
|   | 
|     private static float _checkTime = 0; | 
|     /// <summary> | 
|     /// 当前服务器时间 | 
|     /// </summary> | 
|     public static DateTime ServerNow | 
|     { | 
|         get | 
|         { | 
|             float tick = Time.realtimeSinceStartup - _checkTime; | 
|             DateTime real = s_ServerTime.AddSeconds(tick); | 
|             return real; | 
|         } | 
|         private set | 
|         { | 
|             s_ServerTime = value; | 
|         } | 
|     } | 
|   | 
|     //A0 04 同步客户端时间 #tagServerDateTime 中的 CrossServerTime 为玩家在子服中收到的跨服时间 | 
|     static DateTime s_CrossServerTime = DateTime.Now; | 
|     static float _crossCheckTime = 0; | 
|     public static DateTime CrossServerNow | 
|     { | 
|         get | 
|         { | 
|             float tick = Time.realtimeSinceStartup - _crossCheckTime; | 
|             DateTime real = s_CrossServerTime.AddSeconds(tick); | 
|             return real; | 
|         } | 
|         private set { s_CrossServerTime = value; } | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 年份 | 
|     /// </summary> | 
|     public static int Year | 
|     { | 
|         get { return ServerNow.Year; } | 
|     } | 
|     /// <summary> | 
|     /// 月份 | 
|     /// </summary> | 
|     public static int Month | 
|     { | 
|         get { return ServerNow.Month; } | 
|     } | 
|     /// <summary> | 
|     /// 天 | 
|     /// </summary> | 
|     public static int Day | 
|     { | 
|         get { return ServerNow.Day; } | 
|     } | 
|     /// <summary> | 
|     /// 小时 | 
|     /// </summary> | 
|     public static int Hour | 
|     { | 
|         get { return ServerNow.Hour; } | 
|     } | 
|     /// <summary> | 
|     /// 分钟 | 
|     /// </summary> | 
|     public static int Minute | 
|     { | 
|         get { return ServerNow.Minute; } | 
|     } | 
|     /// <summary> | 
|     /// 秒 | 
|     /// </summary> | 
|     public static int Second | 
|     { | 
|         get { return ServerNow.Second; } | 
|     } | 
|   | 
|     // 风险点1 System.TimeZone.CurrentTimeZone.ToLocalTime 为本机, ServerNow为服务器,如果不存在同一个时区会造成时间差 | 
|     // 风险点2 OriginalTime固定写死中国时区,可根据utc计算出时区,方便海外各个版本使用 | 
|     /// <summary> | 
|     /// 服务器起始时间 | 
|     /// </summary> | 
|     public static readonly DateTime OriginalTime = new DateTime(1970, 1, 1, 8, 0, 0); | 
|     public static readonly DateTime ClientOriginalTime = new DateTime(1, 1, 1, 0, 0, 0); | 
|     /// <summary> | 
|     /// 服务器时间相比起始时间的秒数(即服务器的时间戳) | 
|     /// </summary> | 
|     public static int AllSeconds | 
|     { | 
|         get | 
|         { | 
|             TimeSpan t = ServerNow - OriginalTime; | 
|             return (int)t.TotalSeconds; | 
|         } | 
|     } | 
|   | 
|     //1年中的第几周,以服务端为准,python和c#算出来不一样 | 
|     public static int WeekOfYear | 
|     { | 
|         get; private set; | 
|     } | 
|     //开服第几天 从0开始  | 
|     public static int OpenDay | 
|     { | 
|         get; private set; | 
|     } | 
|   | 
|     public static bool IsMixServer | 
|     { | 
|         get; private set; | 
|     } | 
|   | 
|     public static int MixOpenDay | 
|     { | 
|         get; private set; | 
|     } | 
|   | 
|     public static DayOfWeek openServerDayOfWeek; | 
|   | 
|     public static int OpenWeekCnt | 
|     { | 
|         get | 
|         { | 
|             var _openDay = ServerNow.AddDays(-OpenDay); | 
|             var _opendayOfWeek = _openDay.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)_openDay.DayOfWeek; | 
|             _openDay = _openDay.AddDays(7 - _opendayOfWeek + 1); | 
|             var _openTime = new DateTime(_openDay.Year, _openDay.Month, _openDay.Day, 0, 0, 0); | 
|             var _total = Mathf.Max(0, (float)ServerNow.Subtract(_openTime).TotalDays); | 
|             return Mathf.CeilToInt((float)_total / 7); | 
|         } | 
|     } | 
|   | 
|     static StringBuilder stringBuilder = new StringBuilder(); | 
|   | 
|     public static DateTime createRoleTime { get; private set; } | 
|     private static DateTime createRoleTimeTail = DateTime.Now; | 
|   | 
|     //从1开始 | 
|     public static int CreateDays | 
|     { | 
|         get | 
|         { | 
|             return Mathf.CeilToInt((float)(ServerNow - createRoleTimeTail).TotalDays); | 
|         } | 
|     } | 
|   | 
|     public static int CreateSeconds | 
|     { | 
|         get | 
|         { | 
|             return (int)(createRoleTime - OriginalTime).TotalSeconds; | 
|         } | 
|     } | 
|   | 
|     public static event Action OnCreateRoleTimeRefresh; | 
|     // public static void OnRefreshCreateRoleTime(HA124_tagMCPlayerInfo _package) | 
|     // { | 
|   | 
|   | 
|     //     createRoleTime = Convert.ToDateTime(UIHelper.GetTime(_package.CreateRoleTime)); | 
|     //     createRoleTimeTail = new DateTime(createRoleTime.Year, createRoleTime.Month, createRoleTime.Day); | 
|     //     if (OnCreateRoleTimeRefresh != null) | 
|     //     { | 
|     //         OnCreateRoleTimeRefresh(); | 
|     //     } | 
|     //     Debug.LogFormat("CreateRoleTime {0}  CreateDays {1}", createRoleTimeTail, CreateDays); | 
|     // } | 
|   | 
|     public static event Action OnServerTimeRefresh; | 
|     public static void OnRefreshServerTime(HA004_tagServerDateTime vNetData) | 
|     { | 
|         var dateTime = new DateTime(vNetData.Year, vNetData.Month, vNetData.Day, vNetData.Hour, vNetData.Minute, vNetData.Second); | 
|   | 
|         s_ServerTime = dateTime; | 
|         _checkTime = Time.realtimeSinceStartup; | 
|         if (OnServerTimeRefresh != null) | 
|         { | 
|             OnServerTimeRefresh(); | 
|         } | 
|   | 
|         s_CrossServerTime = Convert.ToDateTime(vNetData.CrossServerTime); | 
|         _crossCheckTime = Time.realtimeSinceStartup; | 
|   | 
|         TimeDownMgr.Instance.Begin(TimeDownMgr.CoolTimeType.SyncServerTime, 60, (float tick) => | 
|         { | 
|             SyncServerTime(); | 
|         }, 60); | 
|     } | 
|   | 
|     public static event Action OnServerOpenDayRefresh; | 
|     public static void OnRefreshServerOpenDay(HA005_tagOpenServerDay package) | 
|     { | 
|         { | 
|             OpenDay = package.Day; | 
|             IsMixServer = package.IsMixServer == 1; | 
|             MixOpenDay = package.MixDay; | 
|             openServerDayOfWeek = package.OpenWeekday == 7 ? DayOfWeek.Sunday : (DayOfWeek)package.OpenWeekday; | 
|             WeekOfYear = package.WeekOfYear; | 
|         } | 
|   | 
|         OnRefreshServerTime(new HA004_tagServerDateTime() | 
|         { | 
|             Year = package.NowYear, | 
|             Month = package.NowMonth, | 
|             Day = package.NowDay, | 
|             Hour = package.NowHour, | 
|             Minute = package.NowMinute, | 
|             Second = package.NowSecond, | 
|             MicSecond = package.NowMicSecond, | 
|             socketType = package.socketType, | 
|         }); | 
|   | 
|   | 
|         if (OnServerOpenDayRefresh != null) | 
|         { | 
|             OnServerOpenDayRefresh(); | 
|         } | 
|     } | 
|   | 
|     public static void SyncServerTime() | 
|     { | 
|         CA002_tagClientRequestServerTime pak = new CA002_tagClientRequestServerTime(); | 
|         GameNetSystem.Instance.SendInfo(pak); | 
|   | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 根据服务器下发的秒数获取时间 | 
|     /// </summary> | 
|     /// <param name="seconds"></param> | 
|     /// <returns></returns> | 
|     public static DateTime GetTime(uint seconds) | 
|     { | 
|         DateTime d = OriginalTime.AddTicks(seconds * TimeSpan.TicksPerSecond); | 
|         return d; | 
|     } | 
|   | 
|     //时:分:秒 | 
|     //例子 | 
|     //xx:xx:xx | 
|     public static string SecondsToHMS(int _seconds) | 
|     { | 
|         int hours = _seconds / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         return StringUtility.Contact(hours.ToString("D2"), ":", mins.ToString("D2"), ":", seconds.ToString("D2")); | 
|     } | 
|   | 
|     //详细显示 | 
|     //xx小时xx分XX秒 | 
|     //xx分XX秒 | 
|     //xx秒 | 
|     public static string SecondsToHMSEx(int _seconds) | 
|     { | 
|         int hours = _seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         if (hours > 0) | 
|         { | 
|             return StringUtility.Contact(hours, Language.Get("L1072"), mins, Language.Get("L1073"), seconds, Language.Get("L1075")); | 
|         } | 
|         else if (mins > 0) | 
|         { | 
|             return StringUtility.Contact(mins, Language.Get("L1073"), seconds, Language.Get("L1075")); | 
|         } | 
|         else | 
|         { | 
|             return StringUtility.Contact(seconds, Language.Get("L1075")); | 
|         } | 
|     } | 
|   | 
|   | 
|     //例子;分:秒 | 
|     //xx:xx | 
|     public static string SecondsToMS(int _seconds) | 
|     { | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         return StringUtility.Contact(mins.ToString("D2"), ":", seconds.ToString("D2")); | 
|     } | 
|   | 
|     //例子;不足的不显示 如0天0:xx:xx:,显示为xx:xx | 
|     //x天xx:xx:xx秒 | 
|     public static string SecondsToDHMSCHS(int _seconds) | 
|     { | 
|         int days = _seconds / 86400; | 
|         int hours = _seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         return StringUtility.Contact(days > 0 ? days.ToString() : string.Empty, | 
|             days > 0 ? Language.Get("L1074") + " " : string.Empty, hours > 0 ? hours.ToString() : string.Empty, | 
|             hours > 0 ? ":" : string.Empty, mins >= 0 ? mins.ToString("D2") : string.Empty, | 
|             mins >= 0 ? ":" : string.Empty, seconds >= 0 ? seconds.ToString("D2") : string.Empty, | 
|             seconds >= 0 ? string.Empty : string.Empty); | 
|     } | 
|   | 
|   | 
|     //例子 | 
|     //x天 | 
|     //x时 | 
|     //x分 最小1分 | 
|     public static string SecondsToTitleDHMS(int _seconds) | 
|     { | 
|         int days = _seconds / 86400; | 
|         if (days > 0) | 
|         { | 
|             return StringUtility.Contact(days, Language.Get("L1074")); | 
|         } | 
|         int hours = _seconds % 86400 / 3600; | 
|         if (hours > 0) | 
|         { | 
|             return StringUtility.Contact(hours, Language.Get("Hour")); | 
|         } | 
|         int mins = Mathf.CeilToInt(_seconds % 3600 / 60.0f); | 
|         if (mins > 0) | 
|         { | 
|             return StringUtility.Contact(mins, Language.Get("Minute")); | 
|         } | 
|         return StringUtility.Contact(1, Language.Get("Minute")); | 
|     } | 
|   | 
|   | 
|     //例子; | 
|     //xx:xx:xx | 
|     public static string SecondsToHMSCHSRetain(int _seconds, bool _hour = true, bool _min = true, bool _sec = true) | 
|     { | 
|         stringBuilder.Length = 0; | 
|         int hours = _seconds / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         if (hours > 0 || _hour) | 
|         { | 
|             stringBuilder.Append(hours); | 
|             stringBuilder.Append(":"); | 
|         } | 
|         if (mins > 0 || _min) | 
|         { | 
|             stringBuilder.Append(mins); | 
|             stringBuilder.Append(":"); | 
|         } | 
|         if (seconds > 0 || _sec) | 
|         { | 
|             stringBuilder.Append(seconds); | 
|             //stringBuilder.Append(":"); | 
|         } | 
|         return stringBuilder.ToString(); | 
|     } | 
|   | 
|     //例子 | 
|     //大于1天的显示:x天xx:xx:xx | 
|     //xx:xx:xx | 
|     public static string SecondsToDHMS(int _seconds) | 
|     { | 
|         int days = _seconds / 86400; | 
|         int hours = _seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         if (days > 0) | 
|         { | 
|             return StringUtility.Contact(days, Language.Get("L1074"), " ", hours.ToString("D2"), ":", mins.ToString("D2"), ":", seconds.ToString("D2")); | 
|         } | 
|         return StringUtility.Contact(hours.ToString("D2"), ":", mins.ToString("D2"), ":", seconds.ToString("D2")); | 
|     } | 
|   | 
|     //极简显示 | 
|     // x天 或者 x天x小时 | 
|     // x小时 或者 x小时x分 | 
|     // x分 | 
|     // x秒 | 
|     public static string SecondsToShortDHMS(int _seconds) | 
|     { | 
|         int days = _seconds / 86400; | 
|         int hours = _seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         if (days > 0) | 
|         { | 
|             if (hours == 0) | 
|             { | 
|                 return StringUtility.Contact(days, Language.Get("L1074")); | 
|             } | 
|             return StringUtility.Contact(days, Language.Get("L1074"), hours, Language.Get("L1072")); | 
|         } | 
|         else if (hours > 0) | 
|         { | 
|             if (mins == 0) | 
|             { | 
|                 return StringUtility.Contact(hours, Language.Get("L1072")); | 
|             } | 
|             return StringUtility.Contact(hours, Language.Get("L1072"), mins, Language.Get("L1073")); | 
|         } | 
|         else if (mins > 0) | 
|         {  | 
|             return StringUtility.Contact(mins, Language.Get("L1073")); | 
|         } | 
|         return StringUtility.Contact(seconds, Language.Get("L1075")); | 
|     } | 
|   | 
|   | 
|   | 
|     //例子 | 
|     //大于24小时显示:x天xx小时xx分 | 
|     //小于24小时显示:xx:xx:xx | 
|     public static string SecondsToDHMSEx(int _seconds) | 
|     { | 
|         int days = _seconds / 86400; | 
|         int hours = _seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         int seconds = _seconds % 60; | 
|         if (days > 0) | 
|         { | 
|             return StringUtility.Contact(days, Language.Get("L1074"), hours.ToString("D2"), Language.Get("L1072"), mins.ToString("D2"), Language.Get("L1073")); | 
|         } | 
|         return StringUtility.Contact(hours.ToString("D2"), ":", mins.ToString("D2"), ":", seconds.ToString("D2")); | 
|     } | 
|   | 
|   | 
|     //例子 | 
|     //x天 | 
|     //x时 | 
|     //x分 | 
|     //x秒 | 
|     public static string SecondsToConsumeRebate(int _seconds) | 
|     { | 
|         float days = (float)_seconds / 86400; | 
|         float hours = (float)_seconds % 86400 / 3600; | 
|         int mins = _seconds % 3600 / 60; | 
|         float seconds = (float)_seconds % 60; | 
|         if (days >= 1) | 
|         { | 
|             return StringUtility.Contact(Mathf.CeilToInt(days), Language.Get("L1074")); | 
|         } | 
|         else if (hours >= 1) | 
|         { | 
|             return StringUtility.Contact(Mathf.CeilToInt(hours), Language.Get("L1072")); | 
|         } | 
|         else if (mins >= 1) | 
|         { | 
|             return StringUtility.Contact(mins, Language.Get("L1073")); | 
|         } | 
|         else | 
|         { | 
|             return StringUtility.Contact(seconds, Language.Get("L1075")); | 
|         } | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取一天的0点时间 | 
|     /// </summary> | 
|     /// <param name="now"></param> | 
|     /// <returns></returns> | 
|     public static DateTime GetDayStartTime(int year, int month, int day) | 
|     { | 
|         return new DateTime(year, month, day); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取当天的0点时间 | 
|     /// </summary> | 
|     /// <returns></returns> | 
|     public static DateTime GetTodayStartTime() | 
|     { | 
|         var now = ServerNow; | 
|         return new DateTime(now.Year, now.Month, now.Day); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取当天的24点时间 | 
|     /// </summary> | 
|     /// <returns></returns> | 
|     public static DateTime GetTodayEndTime() | 
|     { | 
|         var now = ServerNow.AddDays(1); | 
|         return new DateTime(now.Year, now.Month, now.Day); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 获取下一个凌晨5点的时间 | 
|     /// </summary> | 
|     /// <returns></returns> | 
|     public static DateTime GetNext5Time() | 
|     { | 
|         var now = ServerNow; | 
|         if (now.Hour < 5) | 
|         { | 
|             return new DateTime(now.Year, now.Month, now.Day, 5, 0, 0); | 
|         } | 
|         return new DateTime(now.Year, now.Month, now.Day, 5, 0, 0).AddDays(1); | 
|   | 
|     } | 
|   | 
|     //开服天结束倒计时;单位秒 | 
|     public static int GetRemindTimeByOpenDay(int days) | 
|     { | 
|         if (days <= OpenDay) | 
|             return 0; | 
|   | 
|         return (days - OpenDay) * 86400 - (int)(ServerNow - GetTodayStartTime()).TotalSeconds; | 
|   | 
|     } | 
|   | 
|     //获得已过了多少天(0点过天整数,第一天为0) | 
|     // seconds 为时间戳 | 
|     public static int GetPassDays(int seconds) | 
|     { | 
|         DateTime d = OriginalTime.AddTicks(seconds * TimeSpan.TicksPerSecond); | 
|         DateTime startTime = new DateTime(d.Year, d.Month, d.Day); | 
|   | 
|         return (ServerNow - startTime).Days; | 
|     } | 
|   | 
|     //今日剩余秒数 | 
|     public static int GetTodayRemainSeconds() | 
|     { | 
|         return (int)(GetTodayEndTime() - ServerNow).TotalSeconds; | 
|     } | 
| } |