json格式传递日期数据前端无法转换解决办法

服务器向客户端传递数据如果数据量大,需要考虑将其转换为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

以上三种方法是笔者遇到问题后在参考了若干帖子后总结的,如果有更好的方法,欢迎大家告诉我。

主要参考连接:

https://www.jb51.net/article/46456.htm

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韦_恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值