using System;
namespace AlicizaX.Runtime
{
///
/// 游戏时间帮助类
///
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;
}
}
}