服务器向客户端传递数据如果数据量大,需要考虑将其转换为json格式在传递,但是其在传递日期的时候客户端却无法转换过来。
在网上搜索了下解决方案,主要有三种方法,具体介绍如下:
方法一:在服务器端将日期格式使用Select方法或LINQ表达式转换后发到客户端
//学生对象集合
List<Student> students = new List<Student>
{
new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},
new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},
new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}
};
//使用Select方法重新投影对象集合将Birthday属性转换成一个新的属性
//注意属性变化后要重新命名,并立即执行
var studentSet =
students.Select
(
p => new { p.Name, Birthday = p.Birthday.ToString("yyyy-mm-dd") }
).ToList();
//javascript序列化器
JavaScriptSerializer jss = new JavaScriptSerializer();
//序列化学生集合对象得到json字符
string studentsJson = jss.Serialize(studentSet);
//将字符串响应到客户端
context.Response.Write(studentsJson);
这个方法的意思就是,在我们正常将集合对象序列化为json格式前将这个集合对象用linq表达式或select方法找到其中的日期格式,再通过tostring("yyyy-MM-dd")格式化,最后通过select数据投影方式,将原集合对象对应成一个新的集合对象。以这种方式再进行序列化,就会保留日期字符回格式。
但是笔者用此方法没有成功,因为笔者用了EF框架对数据库操作,而EF框架的规范函数中不允许tostring("yyyy-MM-dd")格式化,换句话就是他无法转为对应的sql语句。无奈只能改用他法。
方法二:直接在html页面利用js将传递过来的json日期进行转换
其实json过来的数据是有规律的,例如生日“2014-01-31”变成了1391141532000,这其实是1970 年 1 月 1 日至今的毫秒数;1391141532000/1000/60/60/24/365=44.11年,44+1970=2014年,按这种方法可以得出年月日时分秒和毫秒,所以利用js就可以将数据在前端进行转换。
即在javascript中将"Birthday":"\/Date(1391141532000)\/"中的字符串转换成javascript中的日期对象,可以将Birthday这个Key所对应的Value中的非数字字符以替换的方式删除,到到一个数字1391141532000,然后实例化一个Date对象,将1391141532000毫秒作为参数,得到一个javascript中的日期对象
笔者用这个方法成功了,js转换方法代码如下:
使用时直接将上面这段代码放入<script></script>中即可
//将json转换过来的乱码日期格式转为正常格式
function ChangeDateFormat(cellval) {
var date = new Date(parseInt(cellval.replace("/Date(", "").replace(")/", ""), 10));
var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var currentDay = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
var currentHour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
var currentMinute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
var currentSecond = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
return date.getFullYear() + '-' + month + "-" + currentDay + " " + currentHour + ":" + currentMinute + ":" + currentSecond;
例子使用代码:
使用时通过循环遍历转换后的list数据,将日期作为方法参数调用js转换方法,之后再将转换后的日期放入动态生成的tr行中就可以实现日期的转换了。
var list = $.parseJSON(stuList); //获取返回的“对象集合”,并转成jQuery能识别的JSON格式
//alert(stuList);
//alert(list);
$("#stuList").html(""); //先清除以前的数据
//遍历集合,并添加查询结果
for (var i = 0; i < list.length; i++) {
var date = ChangeDateFormat(list[i].PublishTime);
var studiv = "<tr>"
+ "<td>" + date + "</td>"
+ " <td> <a href='/News/NewsDetail?newsId=" + list[i].NewsId + "' target='_blank'>" + list[i].NewsTitle + "</a></td>"
+ " <td>" + list[i].CategoryName + "</td>"
+ " <td class='book-title'>"
+ " <a class='' href='/WebHotelManage/News/ShowNewsDetail?newsId=" + list[i].NewsId + "&categoryId=" + list[i].CategoryId + "'>修改</a>"
+ " <a name='" + list[i].NewsId + "'class='btndelete' style='cursor:pointer'>删除</a>"
+ " </td></tr>"
$("#stuList").append(studiv); //使用append方法追加项目
}
效果如图(完美解决):
方法三:选择相应的工具
可以选择一些第三方的json工具类,其中不乏有一些已经对日期格式问题已处理好了的,常见的json序列化与反序列化工具库有:(此种方法笔者没有尝试过--理论上讲此种方法应该更方便)
1.fastJSON.
2.JSON_checker.
3.Jayrock.
4.Json.NET - LINQ to JSON.
5.LitJSON.
6.JSON for .NET.
7.JsonFx.
8.JSONSharp.
9.JsonExSerializer.
10.fluent-json
11.Manatee Json
以上三种方法是笔者遇到问题后在参考了若干帖子后总结的,如果有更好的方法,欢迎大家告诉我。
主要参考连接: