You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

196 lines
5.4 KiB

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;
}
}