昨天在学习asp.net的时候,视频里面提到一个问题,那就是Json时间和C#时间的转换。之所以需要进行这种转换,是由于C#起算时间是从1年1月1日 0:00:00开始,而js则是从1970年1月1日0:00:00开始,这导致在两种语言在时间的转换上差异。再加上将DateTime类型的数据转换成Json的时候会带有“/Date(.......)”这样的标记,所以对数据进行转换成为了必然。
转换的方式无非两种,一种在后台通过C#装换成数字字符串然后Request给浏览器再进行进一步的解析。另一种则是将全部数据都直接发给浏览器通过js处理获得。
一、C#预处理
在翻查网上的资料后,发现C#的最小计时单位为Tick=100ns,而js则为1ms,两者相差了10000倍。转换时需要注意。而js返回的时间戳传到C#时是不带时区的,所以js转换成C#时间的时候还需要注意本地化。 如下为代码:private static Int64 dt = new DateTime(1970, 1 , 1).Ticks;
/// <summary>
/// 传入一个DateTime,将其转换为子1970年1月1日起的Int64的数字
/// </summary>
/// <param name="time">需要转换的时间</param>
/// <returns>Int64的数字时间</returns>
public static Int64 Csharp2Json(DateTime time)
{
return Convert.ToInt64((time.Ticks - dt) / 10000);
}
/// <summary>
/// 将Js/Java时间转换成C#时间
/// </summary>
/// <param name="jsTime">js/Java时间</param>
/// <example>"1335258540000"</example>
/// <returns></returns>
public static DateTime Json2Csharp(string jsTime)
{
Int64 longTime = Convert.ToInt64(jsTime) * 10000;
return new DateTime(longTime+=dt).ToLocalTime();
}
上面的代码已包含C# to Js和Js to C#两部分。在前端,我面只需通过下的代码就可以将C#的时间戳转换成具体的时间:
var date=new Date(CsharpTimeTick);
二、直接通过js处理
C#的DateTime被转换成json后,默认格式是这样的: "/Date(1294499956278+0800)/",要转换这种格式的时间,我只要取回中间的“1294499956278”然后直接调用Date() 函数转换即可。
<script type="text/javascriopt>
var patt=/\d{13}/;
var timeNum=paresInt(Tick.match(patt));//Tick为从C#获得的Json时间戳。这里是将获得的字符串转换成数字。
var d=new Date(timeNum);
</script>