一个非常值得参考的时间管理类,非常详细的归纳了一些游戏开发中常用的使用方法,可以直接使用或按照自己的需求或想法重新封装,我在多个项目经常使用,如果大家有自己的想法欢迎在评论区分享出来,大家一起学习共同进步。
using System;
namespace ETHotfix
{
public static class TimeHelper
{
private static readonly long epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks;
public static long ServerTime = 0;
/// <summary>
/// 客户端时间
/// </summary>
/// <returns></returns>
public static long ClientNow()
{
return (DateTime.UtcNow.Ticks - epoch) / 10000;
}
public static long ClientNowSeconds()
{
#if !SERVER
return ServerTime;
#else
return (DateTime.UtcNow.Ticks - epoch) / 10000000;
#endif
}
public static long Now()
{
return ClientNow();
}
public static string UnixToDate(long value)
{
DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
TimeSpan toNow = new TimeSpan(value * 10000000);
var Time = dateTimeStart.Add(toNow);
return Time.ToString("G");
}
public static long DateToTimestamp(DateTime dt)
{
DateTime dateTimeStart = TimeZoneInfo.ConvertTime(new DateTime(1970, 1, 1), TimeZoneInfo.Local);
dt = TimeZoneInfo.ConvertTime(dt, TimeZoneInfo.Utc);
long time = Convert.ToInt64(((dt - dateTimeStart).TotalSeconds));
return time;
}
public static long GetEndOfTodayTimestamp()
{
#if !SERVER
var now = UnixTimeToDateTime(ServerTime);
DateTime endOfToday = now.AddDays(1).Date;
#else
DateTime endOfToday = DateTime.Now.AddDays(1).Date;
#endif
long t = DateToTimestamp(endOfToday);
return t;
}
public static long GetStartOfTodayTimestamp()
{
#if !SERVER
var now = UnixTimeToDateTime(ServerTime);
DateTime startOfToday = now.Date;
#else
DateTime startOfToday = DateTime.Now.Date;
#endif
long t = DateToTimestamp(startOfToday);
return t;
}
#if SERVER
public static (int, int, int) GetHourMinSecond()
{
int hour = DateTime.Now.Hour;
int min = DateTime.Now.Minute;
int second = DateTime.Now.Second;
return (hour, min, second);
}
#endif
public static int GetHour()
{
var now = UnixTimeToDateTime(ClientNowSeconds());
return now.Hour;
}
public static int GetMin()
{
var now = UnixTimeToDateTime(ClientNowSeconds());
return now.Minute;
}
public static int GetSecond()
{
var now = UnixTimeToDateTime(ClientNowSeconds());
return now.Second;
}
public static bool IsSameDay(long time1, long time2)
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
DateTime dt1 = startTime.AddSeconds(time1);
DateTime dt2 = startTime.AddSeconds(time2);
if(dt1.ToString("yyyy/MM/dd") == dt2.ToString("yyyy/MM/dd"))
{
return true;
}
else
{
return false;
}
}
public static DateTime UnixTimeToDateTime(long time)
{
if (time < 0)
throw new ArgumentOutOfRangeException("time is out of range");
return TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1), TimeZoneInfo.Local).AddSeconds(time);
//return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(time);
}
public static string GetDate(long time)
{
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
DateTime dt1 = startTime.AddSeconds(time);
return dt1.ToString("yyyy/MM/dd");
}
// 显示日期
public static string ShowExactTime(long time)
{
DateTime dateTime = UnixTimeToDateTime(time);
return dateTime.ToString("g");
}
// 显示日期 时间
public static string ShowDate(long time)
{
DateTime dateTime = UnixTimeToDateTime(time);
return dateTime.ToString("d");
}
/// <summary>
/// 秒数转换
/// </summary>
/// <param name="second"></param>
/// <returns></returns>
public static string ParseTimeSeconds(double second)
{
var timeSpan = TimeSpan.FromSeconds(second);
var result = "";
if (timeSpan.Days > 0)
result = timeSpan.Days + "天";
if (timeSpan.Hours > 0)
result += timeSpan.Hours + "小时";
if (timeSpan.Minutes > 0)
result += timeSpan.Minutes + "分钟";
if (timeSpan.Seconds > 0)
result += timeSpan.Seconds + "秒";
return result;
}
/// <summary>
/// 秒数转换
/// </summary>
/// <param name="second"></param>
/// <returns></returns>
public static string ParseTimeSecondsFunc(double second)
{
var timeSpan = TimeSpan.FromSeconds(second);
var result = "";
if (timeSpan.Days > 0)
result = timeSpan.Days + "天";
if (timeSpan.Hours > 0)
result += timeSpan.Hours + "小时";
if (timeSpan.Minutes > 0)
result += timeSpan.Minutes + "分钟";
return result;
}
/// <summary>
/// 秒数转换
/// </summary>
/// <param name="second"></param>
/// <returns></returns>
public static string ParseTimeSecondsFunc2(double second)
{
var timeSpan = TimeSpan.FromSeconds(second);
var result = "";
if (timeSpan.Days > 0)
result = timeSpan.Days + ":";
if (timeSpan.Hours > 0)
result += timeSpan.Hours + ":";
if (timeSpan.Minutes > 0)
result += timeSpan.Minutes + ":";
if (timeSpan.Seconds > 0)
result += timeSpan.Seconds + "";
return result;
}
/// <summary>
/// 秒数转换
/// </summary>
/// <param name="second"></param>
/// <returns></returns>
public static string ParseTimeSecondsFunc1(double second)
{
var timeSpan = TimeSpan.FromSeconds(second);
var result = "";
if (timeSpan.Days > 0)
return timeSpan.Days + "天";
if (timeSpan.Hours > 0)
return timeSpan.Hours + "小时";
if (timeSpan.Minutes > 0)
return timeSpan.Minutes + "分钟";
return result;
}
/// <summary>
/// 秒数转换
/// </summary>
/// <param name="second"></param>
/// <returns></returns>
public static string ParseTimeSecondsFunc3(double second)
{
var timeSpan = TimeSpan.FromSeconds(second);
var result = "";
if (timeSpan.Days > 0)
result = timeSpan.Days + "天";
if (timeSpan.Hours > 0)
result += timeSpan.Hours + ":";
if (timeSpan.Minutes > 0)
result += timeSpan.Minutes + ":";
if (timeSpan.Seconds > 0)
result += timeSpan.Seconds + "";
return result;
}
/// <summary>
/// 格式化显示时间为几个月,几天前,几小时前,几分钟前,或几秒前
/// </summary>
/// <param name="dt">要格式化显示的时间</param>
/// <returns>几个月,几天前,几小时前,几分钟前,或几秒前</returns>
public static string DateStringFromNow(long time)
{
#if !SERVER
var now = UnixTimeToDateTime(ServerTime);
#else
var now = DateTime.Now;
#endif
DateTime dt = UnixTimeToDateTime(time);
TimeSpan span = now - dt;
if (span.TotalDays > 60)
{
return dt.ToShortDateString();
}
else if (span.TotalDays > 30)
{
return "1个月前";
}
else if (span.TotalDays > 14)
{
return "2周前";
}
else if (span.TotalDays > 7)
{
return "1周前";
}
else if (span.TotalDays > 1)
{
return string.Format("{0}天前", (int)Math.Floor(span.TotalDays));
}
else if (span.TotalHours > 1)
{
return string.Format("{0}小时前", (int)Math.Floor(span.TotalHours));
}
else if (span.TotalMinutes > 1)
{
return string.Format("{0}分钟前", (int)Math.Floor(span.TotalMinutes));
}
//else if (span.TotalSeconds >= 1)
//{
// return string.Format("{0}秒前", (int)Math.Floor(span.TotalSeconds));
//}
else
{
return "刚刚";
}
}
public static long GetTodayLeftTime()
{
#if !SERVER
var now = UnixTimeToDateTime(ServerTime);
DateTime endOfToday = now.AddDays(1).Date;
long left = GetDiffTime(endOfToday, now);
#else
DateTime endOfToday = DateTime.Now.AddDays(1).Date;
long left = GetDiffTime(endOfToday, DateTime.Now);
#endif
return left;
}
// 获取两个时间的时间差
public static long GetDiffTime(DateTime dt1, DateTime dt2)
{
long diff = (long)(dt1 - dt2).TotalSeconds;
return diff;
}
// 获取两个时间戳之间差的天数
public static int GetDiffDay(long startTime, long endTime)
{
DateTime dateStart = UnixTimeToDateTime(startTime);
DateTime dateEnd = UnixTimeToDateTime(endTime);
DateTime start = Convert.ToDateTime(dateStart.ToShortDateString());
DateTime end = Convert.ToDateTime(dateEnd.ToShortDateString());
TimeSpan sp = end.Subtract(start);
return sp.Days;
}
//获取下周几的时间戳
public static long GetNextWeekDay(int weekday)
{
#if !SERVER
var now = UnixTimeToDateTime(ServerTime);
#else
var now = DateTime.Now;
#endif
// 本周已过天数
int d1 = Convert.ToInt32(now.DayOfWeek);
if (weekday >= 7)
weekday = 0;
DateTime startDay = new DateTime();
if (weekday > d1)
{
startDay = TimeZoneInfo.ConvertTime(now.AddDays(weekday - d1 ), TimeZoneInfo.Local);
}
else
{
startDay = TimeZoneInfo.ConvertTime(now.AddDays(weekday - d1 + 7), TimeZoneInfo.Local);
}
return DateToTimestamp(startDay.Date);
}
//根据时间戳获取周几
public static int GetWeekDay(long time)
{
var date = UnixTimeToDateTime(time);
// 本周已过天数
int d1 = Convert.ToInt32(date.DayOfWeek);
return d1;
//DateTime startDay = new DateTime();
//if (weekday > d1)
//{
// startDay = TimeZoneInfo.ConvertTime(DateTime.Now.AddDays(weekday - d1 - 7 + count * 7), TimeZoneInfo.Local);
//}
//else
//{
// startDay = TimeZoneInfo.ConvertTime(DateTime.Now.AddDays(weekday - d1 + count * 7), TimeZoneInfo.Local);
//}
}
//获取随机数种子
public static int GetRandSeed()
{
string s = ClientNow().ToString();
s = s.Substring(s.Length - 8);
return int.Parse(s);
}
}
}