C# + Unity 开发日记(一)时间戳

一晃眼,从接触编程到从事Unity游戏开发已经过去了一年多的时间。回想当时裸辞,靠着在网上看视频,一步步的进入程序员的行业,现在无比庆幸。为了使自己保持进取心、不断积累进步,便决定通过博客的方式记录下自己在工作中遇到的问题,废话不多说,直接进入正题。

之所以第一篇博客写时间戳的东西,是因目前正在做的SLG项目中经常遇到需要显示时间刷新倒计时的需求,这个只需要用结束时间减去当前时间就可得出剩余时间,通过每秒不断的刷新这个剩余时间文本,即可实现倒计时的功能。

在项目中当前时间客户端可以很容易的获取到,而结束时间,为保证在退出程序重新登录的情况下依然能正常显示刷新倒计时,则需要服务器记录,并在需要的时候发送给客户端。而在一些有固定刷新时间的情况下,客户端可以通过自己计算得到结束时间,比如每小时刷新、每天刷新、每周的某一天刷新,这时候就可以通过时间戳来计算而不用再从服务器获取结束时间。

下面是代码:

    /// 
    /// 转换为10位Unix时间戳
    /// 
    /// DateTime时间
    /// Unix时间戳
    private long ConvertUnixTimeStamp(DateTime time)
    {
        DateTime original = new DateTime(1970, 1, 1, 0, 0, 0);//格林尼治时间
        return (long)(time.ToUniversalTime() - original).TotalSeconds;
    }

    /// 
    /// 10位Unix时间戳转换为Unix DateTime
    /// 
    /// 10位时间戳
    /// Unix DateTime
    private DateTime ConvertUnixDateTime(long time)
    {
        DateTime original = new DateTime(1970, 1, 1, 0, 0, 0);//格林尼治时间
        return original.AddSeconds(time);
    }

    /// 
    /// 10位Unix时间戳转换为本地 DateTime
    /// 
    /// 10位时间戳
    /// 本地 DateTime
    private DateTime ConvertLocalDateTime(long time)
    {
        DateTime original = new DateTime(1970, 1, 1, 0, 0, 0);//格林尼治时间
        return original.AddSeconds(time).ToLocalTime();
    }

    /// 
    /// 给定时间戳得到起始小时整点时间戳
    /// 
    /// 时间戳
    /// 起始小时整点时间戳
    private long ConvertHourStartStamp(long time)
    {
        DateTime date = ConvertUnixDateTime(time);
        DateTime need = new DateTime(date.Year, date.Month, date.Day, date.Hour, 0, 0);
        return ConvertUnixTimeStamp(need);
    }

    /// 
    /// 给定时间戳得到起始天零点时间戳
    /// 
    /// 时间戳
    /// 起始天零点时间戳
    private long ConvertDayStartStamp(long time)
    {
        DateTime date = ConvertUnixDateTime(time);
        DateTime need = new DateTime(date.Year, date.Month, date.Day, 0, 0, 0);
        return ConvertUnixTimeStamp(need);
    }

    /// 
    /// 计算一周某天的零点时间戳
    /// 
    /// 当前时间戳
    /// 计算的天数
    /// 一周某天的零点时间
    private long ConvertDayOfWeekStamp(long time, int day)
    {
        DateTime date = ConvertUnixDateTime(time);
        int nowDay = Convert.ToInt32(date.DayOfWeek);
        DateTime need = new DateTime(date.Year, date.Month, date.Day + (day - nowDay), 0, 0, 0);
        return ConvertUnixTimeStamp(need);
    }

每小时刷新:

        DateTime now = DateTime.Now;
        long currentStamp = ConvertUnixTimeStamp(now);
        long endStamp = ConvertHourStartStamp(currentStamp) + 3600;
        long residue = endStamp - currentStamp;//剩余时间

每天刷新:

        DateTime now = DateTime.Now;
        long currentStamp = ConvertUnixTimeStamp(now);
        long endStamp = ConvertDayStartStamp(currentStamp) + 86400;
        long residue = endStamp - currentStamp;//剩余时间

每周一零点刷新:

        DateTime now = DateTime.Now;
        long currentStamp = ConvertUnixTimeStamp(now);
        long endStamp = ConvertDayOfWeekStamp(currentStamp, 1);
        long residue = endStamp - currentStamp;//剩余时间

需要注意的是这里计算的时候都是以Unix标准时间做的参照,如果以北京时间做参照的话会出现多出8个小时的状况。

你可能感兴趣的:(C#,+,Unity)