using System; using IVDataFormat; // 타임 스케일 무시한 대기 시간 관리. public class TimeUtils { public const int DAY1 = 86400; public const int DAY2 = 172800; public const int DAY3 = 259200; public const int DAY4 = 345600; public const int DAY5 = 432000; public const int DAY6 = 518400; protected static DateTime DT_Device = DateTime.UtcNow; protected static DateTime DT_Now = DateTime.UtcNow; // 다음날(다음 갱신 시간). 한국 시간 오전 10시 기준. protected static DateTime DT_NextDay = DT_Now; protected static DateTime DT_NextWeek = DT_Now; protected static DateTime DT_NextMonth = DT_Now; protected static int I_Locale = (int)((DateTime.Now - DateTime.UtcNow).TotalHours + 0.4d); public static int NextDaySec = DAY1; protected static int NextDayRandDelay = 0; public static int GetLocale() { return I_Locale; } public static fDays GetCurDays() { switch (NowLocal().DayOfWeek) { case DayOfWeek.Sunday: return fDays.Sunday; case DayOfWeek.Monday: return fDays.Monday; case DayOfWeek.Tuesday: return fDays.Tuesday; case DayOfWeek.Wednesday: return fDays.Wednesday; case DayOfWeek.Thursday: return fDays.Thursday; case DayOfWeek.Friday: return fDays.Friday; case DayOfWeek.Saturday: return fDays.Saturday; default: return fDays.None; } } public static DateTime Now() { return DateTime.UtcNow; } public static DateTime NowLocal() { return DateTime.UtcNow.AddHours(9d); } // 다음 날. public static DateTime NextDay() { return DT_NextDay; } public static DateTime ToUTCTime(DateTime datetime) { return datetime.AddHours(-9d); } public static DateTime ToLocalTime(DateTime datetime) { return datetime.AddHours(9d); } public static void SaveDeviceTime() { DT_Device = DateTime.UtcNow; } public static double ReCalcNow() { DateTime nowdevice = DateTime.UtcNow; TimeSpan ts = nowdevice - DT_Device; if (nowdevice <= DT_Device) return ts.TotalSeconds; DT_Now = DT_Now.AddSeconds(ts.TotalSeconds); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; DT_Device = nowdevice; if (DT_Now > DT_NextDay) { CalcNextDay(); CalcNextWeek(); CalcNextMonth(); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; SingleMgr.ProcessNewDay(); } return ts.TotalSeconds; } public static void AddNowSec1() { DT_Now = DT_Now.AddSeconds(1d); NextDaySec--; if (NextDaySec <= 0) { CalcNextDay(); CalcNextWeek(); CalcNextMonth(); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; SingleMgr.ProcessNewDay(); } } public static void AddNowSec(double time) { DT_Now = DT_Now.AddSeconds(time); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; if (DT_Now > DT_NextDay) { CalcNextDay(); CalcNextWeek(); CalcNextMonth(); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; SingleMgr.ProcessNewDay(); } } // 다음날까지 남은 시간. 한국 시간 오전 10시 기준. public static TimeSpan ToNextDayRemain() { return new TimeSpan(0, 0, NextDaySec); } // 다음주. 한국 시간 오전 10시 기준. private static void CalcNextDay() { DT_NextDay = DateTime.UtcNow.AddHours(-1d).AddDays(1d).Date.AddHours(1d).AddSeconds(NextDayRandDelay); } // 다음 날. 한국 시간 오전 10시 기준. public static DateTime NextDayUtc() { return DT_NextDay; } // 다음주(월요일). 한국 시간 오전 10시 기준. private static void CalcNextWeek() { DateTime dtnow = Now().AddHours(-1d); int idaystoadd = ((int)DayOfWeek.Monday - (int)dtnow.DayOfWeek + 7) % 7; if (idaystoadd == 0) idaystoadd = 7; DT_NextWeek = dtnow.AddDays(idaystoadd).Date.AddHours(1d).AddSeconds(NextDayRandDelay); } // 다음주(월요일). 한국 시간 오전 10시 기준. public static DateTime NextWeekUtc() { return DT_NextWeek; } // 다음달(1일). 한국 시간 오전 10시 기준. private static void CalcNextMonth() { DateTime dtnow = Now().AddHours(-1d); DT_NextMonth = new DateTime(dtnow.AddMonths(1).Year, dtnow.AddMonths(1).Month, 1).AddHours(1d).AddSeconds(NextDayRandDelay); } // 다음달(1일). 한국 시간 오전 10시 기준. public static DateTime NextMonthUtc() { return DT_NextMonth; } public static void SetNetworkTime(DateTime datetime) { #if UNITY_EDITOR datetime = DateTime.UtcNow; #endif if (datetime == null || datetime.Equals(DateTime.MinValue)) return; NextDayRandDelay = UnityEngine.Random.Range(0, 10); DT_Now = datetime; CalcNextDay(); CalcNextWeek(); CalcNextMonth(); NextDaySec = (int)(DT_NextDay - DT_Now).TotalSeconds; } }