C# DateTime 类型与 Javascript Date 类型的相互转换
2011-03-17 20:00 方渡远 阅读(7288) 评论(2) 编辑 收藏 举报Asp.net MVC 站点设计中, 要求以 ajax 方式从服务器获取 <时间, 数值> 对, 以便在网页上绘制曲线图.
蛋疼的问题来了: 在使用框架提供的 json 序列化时, C# 的 DateTime 被转成了
\/Date(1245398693390)\/
网页上的 jQuery 不认识这种格式...
于是果断 Google. 网友提供了很多种方法.
使用正则表达式
分析得到, 括号里的那一串数字是自 1970年1月1日 00:00:00 到原来的那个 DateTime 所表示的时间所经过的毫秒数, 如果能使用正则表达式把它提取出来, 就能以此构造出一个 Javascript Date 对象.
代码如下
var re = /-?\d+/; var m = re.exec(json_date_string); var d = new Date(parseInt(m[0]));
我对正则表达式不是很感冒, 总觉得很难懂... 于是没有用这种方法.
编写 C# 函数预先将日期转换
既然在 Javascript中 是以毫秒为单位对时间进行记录的,并且起始时间是 1970年1月1日 00:00:00 (这个是时间 UTC, 即格林威治时间的0点. 在中国, 应该是 1970年1月1日 08:00:00, 因为中国是东八区, 须在格林威治时间的 0 点上加上 8 个小时). 而 C# 的时间是以 Ticks 为单位进行记录的, 直译就是 CPU 的时间 "滴答", 是一个比毫秒还小的单位 (实际上是自 0001 年 1 月 1 日午夜 12:00 以来所经过时间以 100 毫微秒为间隔表示时的数字... 靠, 就不能用一个标准吗... -_-||| ). 我们就可以在服务器端先将日期转换成 Javascript 能识别的格式. 在这两者之间进行转化, 需要注意起始时间的转换和时区的转换, 以下代码可是实现由C# 的时间到 Javascript 的时间的转换.
public class ExtensionMethods { // returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates) public static double UnixTicks(this DateTime dt) { DateTime d1 = new DateTime(1970, 1, 1); DateTime d2 = dt.ToUniversalTime(); TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks); return ts.TotalMilliseconds; } }
这种方法对于大量发送 <时间, 数值> 对的情况比较方便.
问题: 这种方法中提到要现将想要处理的时间转化成 UniversalTime, 但在实际操作中, 转换后的结果反而少了八小时, 不知道是什么情况...
将毫秒值转成 C# DateTime 类型
最后的问题是将 Javascript 在查询参数中提交的毫秒值转换成 C# DateTime 类型.
static DateTime ConvertTime(long time) { DateTime timeStamp = new DateTime(1970, 1, 1); //得到1970年的时间戳 long t = (time + 8 * 60 * 60) * 10000000 + timeStamp.Ticks; DateTime dt = new DateTime(t); return dt; }
同样, 那八个小时我觉得貌似加上就不对了...
折腾了大半天, 浏览器和服务器总算是能正常进行交互了, 今天的任务结束~