C# DateTime 类型与 Javascript Date 类型的相互转换
2011-03-17 20:00 方渡远 阅读(7315) 评论(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; } |
同样, 那八个小时我觉得貌似加上就不对了...
折腾了大半天, 浏览器和服务器总算是能正常进行交互了, 今天的任务结束~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)