今天遇到了从服务器获取unix时间戳,将其转换为时间并显示的需求。Unity中可以使用C#中有关的date函数来处理这个问题。
首先UNIX时间戳的定义如下:
Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)
是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
UNIX时间戳的0按照ISO 8601规范为 :1970-01-01T00:00:00Z.
一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。
在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。
DateTime dt = DateTime.Now;
dt.ToString();
dt.ToFileTime().ToString();
dt.ToFileTimeUtc().ToString();
dt.ToLocalTime().ToString();
dt.ToLongDateString().ToString();
dt.ToLongTimeString().ToString();
dt.ToOADate().ToString();
dt.ToShortDateString().ToString();
dt.ToShortTimeString().ToString();
dt.ToUniversalTime().ToString();
dt.Year.ToString();
dt.Date.ToString();
dt.DayOfWeek.ToString();
dt.DayOfYear.ToString();
dt.Hour.ToString();
dt.Millisecond.ToString();
dt.Minute.ToString();
dt.Month.ToString();
dt.Second.ToString();
dt.Ticks.ToString();
dt.TimeOfDay.ToString();
Unity中运行结果如下:
值得注意的是Unity中似乎默认的都是12进制,而不是24小时的。策划要求24小时进制显示,因此最后我的UNIX时间戳转换代码如下:
/* 将UNIX时间戳转换成系统时间 */ public static string getTime(string _time) { string timeStamp = _time; DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));//基准值 long lTime = long.Parse(timeStamp + "0000000"); //转换到Tick计时单位 TimeSpan toNow = new TimeSpan(lTime); DateTime dtResult = dtStart.Add(toNow); string date = dtResult.ToShortDateString().ToString(); string time = dtResult.ToString("HH:mm:ss").ToString(); //24进制string[] date_arr = date.Split('/'); string[] time_arr = time.Split(':'); string result = date_arr[0]+"月"+date_arr[1]+"日"+" "+time_arr[0]+":"+time_arr[1]; return result; }
这里再说下TimeSpan
TimeSpan是用来表示一个时间段的实例,两个时间的差可以构成一个TimeSpan实例
DateTime.Tick :是一个计时周期,表示一百纳秒,即一千万分之一秒,那么 Ticks 在这里表示总共相差多少个时间周期,也就是说,Tick是TimeSpan的计时单位。
因此
在这里将时间戳转换成了Tick计时单位。
下边是将时间转回unix时间戳
epoch = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000