有時(shí)候策劃需要一個(gè)第二天0點(diǎn)刷新活動(dòng)界面的操作,這個(gè)案例可以幫助解決部分問題。
然后測試了下時(shí)間戳的相互轉(zhuǎn)換以及倒計(jì)時(shí)的計(jì)時(shí)操作等等。
寫了一些常用的時(shí)間戳轉(zhuǎn)換和時(shí)間戳解析的函數(shù)。
詳情看代碼邏輯和注釋。
using System;
using UnityEngine;
namespace Assets.Test
{
public class TimeTest : MonoBehaviour
{
//一天總共的秒數(shù)
private const int CN_ONE_DAY_SECONDS = 24 * 60 * 60;
//一小時(shí)總共的秒數(shù)
private const int CN_ONE_HOUR_SECONDS = 60 * 60;
//一分鐘總共的秒數(shù)
private const int CN_ONE_MIN_SECONDS = 60;
//明天0點(diǎn)的時(shí)間戳
private long _nextDayMidNight = 0;
private bool _hasRefeshed = false;
//當(dāng)前界面停留的總時(shí)間(秒)
private float _passTime = 0;
//用于減少打印次數(shù),間隔1秒進(jìn)行打印顯示
private float _lastPassTime = 1;
/// <summary>
/// 當(dāng)前的時(shí)間戳
/// </summary>
private long TimeStampNow
{
get
{
return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
}
private delegate void OnNewDayComming();
private event OnNewDayComming OnNewDayEvent;
private void Awake()
{
//用明天0點(diǎn)的時(shí)間戳作為結(jié)束時(shí)間
_nextDayMidNight = GetNextDayZeroTimeStamp();
//int reaminSec = (int)(_nextDayMidNight - TimeStampNow);
晚上12點(diǎn)的倒計(jì)時(shí)
//Debug.LogFormat("到今晚0點(diǎn)剩余時(shí)間:{0}", ConvertSecToDHMS(reaminSec));
//設(shè)置一個(gè)到時(shí)的觸發(fā)事件
OnNewDayEvent += OnNewDayRefeshData;
}
private void OnNewDayRefeshData()
{
Debug.Log("新的一天了!");
}
private void Update()
{
//TODO 這里其實(shí)是有問題的,沒有進(jìn)行輪詢的操作。 只算了第二天的0點(diǎn),如果是第三天0點(diǎn)這里就不行了的
if (TimeStampNow >= _nextDayMidNight && !_hasRefeshed)
{
//到點(diǎn)之后執(zhí)行回調(diào)
_hasRefeshed = true;
if (OnNewDayEvent != null)
{
OnNewDayEvent();
}
}
else
{
//計(jì)算當(dāng)前經(jīng)過的總時(shí)間(每幀執(zhí)行的時(shí)間相加)
_passTime += Time.deltaTime;
//每隔1秒進(jìn)入一次打印
if (_passTime - _lastPassTime > 1)
{
_lastPassTime = _passTime;
Debug.LogFormat("到今晚0點(diǎn)剩余時(shí)間:{0}", ConvertSecToDHMS((int)(_nextDayMidNight - TimeStampNow)));
}
}
}
/// <summary>
/// 把秒數(shù)轉(zhuǎn)換成天時(shí)分秒
/// </summary>
/// <param name="totalSeconds">總的秒數(shù)</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}時(shí):{2}分:{3}秒:", days, hours, minutes, seconds);
}
//獲取第二天的0點(diǎn)的時(shí)間戳(游戲中常用作活動(dòng)的刷新,可以做個(gè)計(jì)時(shí)器,獲取到這個(gè)時(shí)間戳然后我當(dāng)前時(shí)間戳相減做回調(diào)處理)
private long GetNextDayZeroTimeStamp()
{
//當(dāng)天0時(shí)0分0秒
DateTime todayMidnight = DateTime.Now.Date;
//第二天的0時(shí)0分0秒
DateTime nextDayMidnight = todayMidnight.AddDays(1);
return ConvertToTimeStamp(nextDayMidnight);
}
/// <summary>
/// DateTime轉(zhuǎn)時(shí)間戳
/// </summary>
/// <param name="targetDateTime">DateTime</param>
/// <returns>時(shí)間戳(秒)</returns>
public long ConvertToTimeStamp(DateTime targetDateTime)
{
return (targetDateTime.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
}
/// <summary>
/// 時(shí)間戳轉(zhuǎn)DateTime
/// </summary>
/// <param name="timeStamp">時(shí)間戳(秒)</param>
/// <returns>DateTime</returns>
public DateTime GetDateTimeFromTimeStamp(long timeStamp)
{
//獲取到當(dāng)前時(shí)區(qū)的開始時(shí)間戳
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;
}
}
}
運(yùn)行的效果,每隔1秒顯示下倒計(jì)時(shí):
文章來源:http://www.zghlxwxcb.cn/news/detail-553647.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-553647.html
到了這里,關(guān)于Unity跨天的判斷,以及時(shí)間戳轉(zhuǎn)換成天時(shí)分秒的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!