Unity基于C#的时间管理类(TimeHelper)

一个非常值得参考的时间管理类,非常详细的归纳了一些游戏开发中常用的使用方法,可以直接使用或按照自己的需求或想法重新封装,我在多个项目经常使用,如果大家有自己的想法欢迎在评论区分享出来,大家一起学习共同进步。

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);
        }
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天宇u3d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值