代码改变世界

C# DateTime 类型与 Javascript Date 类型的相互转换

2011-03-17 20:00  方渡远  阅读(7202)  评论(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;
}

同样, 那八个小时我觉得貌似加上就不对了...

折腾了大半天, 浏览器和服务器总算是能正常进行交互了, 今天的任务结束~