Unity跨天的判断,以及时间戳转换成天时分秒

这篇具有很好参考价值的文章主要介绍了Unity跨天的判断,以及时间戳转换成天时分秒。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有时候策划需要一个第二天0点刷新活动界面的操作,这个案例可以帮助解决部分问题。

然后测试了下时间戳的相互转换以及倒计时的计时操作等等。

写了一些常用的时间戳转换和时间戳解析的函数。

详情看代码逻辑和注释。

using System;
using UnityEngine;

namespace Assets.Test
{
    public class TimeTest : MonoBehaviour
    {
        //一天总共的秒数
        private const int CN_ONE_DAY_SECONDS = 24 * 60 * 60;
        //一小时总共的秒数
        private const int CN_ONE_HOUR_SECONDS = 60 * 60;
        //一分钟总共的秒数
        private const int CN_ONE_MIN_SECONDS = 60;
        //明天0点的时间戳
        private long _nextDayMidNight = 0;
        private bool _hasRefeshed = false;
        //当前界面停留的总时间(秒)
        private float _passTime = 0;
        //用于减少打印次数,间隔1秒进行打印显示
        private float _lastPassTime = 1;
        /// <summary>
        /// 当前的时间戳
        /// </summary>
        private long TimeStampNow
        {
            get
            {
                return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
            }
        }

        private delegate void OnNewDayComming();
        private event OnNewDayComming OnNewDayEvent;

        private void Awake()
        {
            //用明天0点的时间戳作为结束时间
            _nextDayMidNight = GetNextDayZeroTimeStamp();
            //int reaminSec = (int)(_nextDayMidNight - TimeStampNow);
            晚上12点的倒计时
            //Debug.LogFormat("到今晚0点剩余时间:{0}", ConvertSecToDHMS(reaminSec));
            //设置一个到时的触发事件
            OnNewDayEvent += OnNewDayRefeshData;
        }

        private void OnNewDayRefeshData() 
        {
            Debug.Log("新的一天了!");
        }

        private void Update()
        {
            //TODO  这里其实是有问题的,没有进行轮询的操作。 只算了第二天的0点,如果是第三天0点这里就不行了的
            if (TimeStampNow >= _nextDayMidNight && !_hasRefeshed)
            {
                //到点之后执行回调
                _hasRefeshed = true;
                if (OnNewDayEvent != null)
                {
                    OnNewDayEvent();
                }
            }
            else
            {
                //计算当前经过的总时间(每帧执行的时间相加)
                _passTime += Time.deltaTime;
                //每隔1秒进入一次打印
                if (_passTime - _lastPassTime > 1)
                {
                    _lastPassTime = _passTime;
                    Debug.LogFormat("到今晚0点剩余时间:{0}", ConvertSecToDHMS((int)(_nextDayMidNight - TimeStampNow)));
                }
            }
        }

        /// <summary>
        /// 把秒数转换成天时分秒
        /// </summary>
        /// <param name="totalSeconds">总的秒数</param>
        /// <returns></returns>
        private string ConvertSecToDHMS(int totalSeconds)
        {
            int days    = totalSeconds / CN_ONE_DAY_SECONDS;
            int hours   = totalSeconds % CN_ONE_DAY_SECONDS  / CN_ONE_HOUR_SECONDS;
            int minutes = totalSeconds % CN_ONE_HOUR_SECONDS / CN_ONE_MIN_SECONDS;
            int seconds = totalSeconds % CN_ONE_HOUR_SECONDS % CN_ONE_MIN_SECONDS;
            return string.Format("{0}天:{1}时:{2}分:{3}秒:", days, hours, minutes, seconds);
        }

        //获取第二天的0点的时间戳(游戏中常用作活动的刷新,可以做个计时器,获取到这个时间戳然后我当前时间戳相减做回调处理)
        private long GetNextDayZeroTimeStamp()
        {
            //当天0时0分0秒
            DateTime todayMidnight = DateTime.Now.Date;
            //第二天的0时0分0秒
            DateTime nextDayMidnight = todayMidnight.AddDays(1);
            return ConvertToTimeStamp(nextDayMidnight);
        }

        /// <summary>
        /// DateTime转时间戳
        /// </summary>
        /// <param name="targetDateTime">DateTime</param>
        /// <returns>时间戳(秒)</returns>
        public long ConvertToTimeStamp(DateTime targetDateTime)
        {
            return (targetDateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
        }

        /// <summary>
        /// 时间戳转DateTime
        /// </summary>
        /// <param name="timeStamp">时间戳(秒)</param>
        /// <returns>DateTime</returns>
        public DateTime GetDateTimeFromTimeStamp(long timeStamp)
        {
            //获取到当前时区的开始时间戳
            DateTime startDateTime = TimeZoneInfo.ConvertTimeFromUtc(new DateTime(1970, 1, 1, 0, 0, 0), TimeZoneInfo.Local);
            long targetTimeStamp = ((long)timeStamp * 10000000);
            TimeSpan targetTS = new TimeSpan(targetTimeStamp);
            DateTime targetDateTime = startDateTime.Add(targetTS);
            return targetDateTime;
        }
    }
}

运行的效果,每隔1秒显示下倒计时:

unity timespane转换成秒,Unity,unity,游戏引擎,java

 文章来源地址https://www.toymoban.com/news/detail-553647.html

到了这里,关于Unity跨天的判断,以及时间戳转换成天时分秒的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包