一晃眼,从接触编程到从事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个小时的状况。