0

0

解决json日期格式问题的3种方法_json

php中文网

php中文网

发布时间:2016-05-16 17:01:38

|

1641人浏览过

|

来源于php中文网

原创

开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示:

复制代码 代码如下:

//设置服务器响应的结果为纯文本格式
            context.Response.ContentType = "text/plain";
           //学生对象集合
            List students = new List
            {
                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")}
            };

            //javascript序列化器
            JavaScriptSerializer jss=new JavaScriptSerializer();
           //序列化学生集合对象得到json字符
            string studentsJson=jss.Serialize(students);
           //将字符串响应到客户端
            context.Response.Write(studentsJson);
           context.Response.End();

运行结果是:

其中Tom所对应生日“2014-01-31”变成了1391141532000,这其实是1970 年 1 月 1 日至今的毫秒数;1391141532000/1000/60/60/24/365=44.11年,44+1970=2014年,按这种方法可以得出年月日时分秒和毫秒。这种格式是一种可行的表示形式但不是普通人可以看懂的友好格式,怎么让这个格式变化?

解决办法:

方法1:在服务器端将日期格式使用Select方法或LINQ表达式转换后发到客户端:

复制代码 代码如下:

using System;
using System.Collections.Generic;
using System.Web;

using System.Web.Script.Serialization;

namespace JsonDate1
{
    using System.Linq;

    ///


    /// 学生类,测试用
    ///

    public class Student
    {
        ///
        /// 姓名
        ///

        public String Name { get; set; }

        ///


        /// 生日
        ///

        public DateTime Birthday { get; set; }
    }

    ///


    /// 返回学生集合的json字符
    ///

    public class GetJson : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //设置服务器响应的结果为纯文本格式
            context.Response.ContentType = "text/plain";
            //学生对象集合
            List students = new List
            {
                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);
            context.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}


Select方法重新投影对象集合将Birthday属性转换成一个新的属性,注意属性变化后要重新命名,属性名可以相同;这里可以使用select方法也可以使用LINQ查询表达式,也可以选择别的方式达到相同的目的;这种办法可以将集合中客户端不用的属性剔除,达到简单优化性能的目的。

运行结果:

这时候的日期格式就已经变成友好格式了,不过在javascript中这只是一个字符串。

方法二:

在javascript中将"Birthday":"\/Date(1391141532000)\/"中的字符串转换成javascript中的日期对象,可以将Birthday这个Key所对应的Value中的非数字字符以替换的方式删除,到到一个数字1391141532000,然后实例化一个Date对象,将1391141532000毫秒作为参数,得到一个javascript中的日期对象,代码如下:

复制代码 代码如下:




    json日期格式处理
   
   


   

json日期格式处理


   

       



运行结果:

上的使用正则/\D/igm达到替换所有非数字的目的,\D表示非数字,igm是参数,分别表示忽视(ignore)大小写;多次、全局(global)替换;多行替换(multi-line);有一些时候还会出现+86的情况,只需要变换正则同样可以达到目的。另外如果项目中反复出现这种需要处理日期格式的问题,可以扩展一个javascript方法,代码如下:

复制代码 代码如下:

$(function () {
            $.getJSON("getJson.ashx", function (students) {
                $.each(students, function (index, obj) {
                  $("
  • ").html(obj.Name).appendTo("#ulStudents");

                      //使用正则表达式将生日属性中的非数字(D)删除
                        //并把得到的毫秒数转换成数字类型
                        var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));
                      //实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数
                        var birthday = new Date(birthdayMilliseconds);

    Kuwebs企业网站管理系统3.1.5 UTF8
    Kuwebs企业网站管理系统3.1.5 UTF8

    酷纬企业网站管理系统Kuwebs是酷纬信息开发的为企业网站提供解决方案而开发的营销型网站系统。在线留言模块、常见问题模块、友情链接模块。前台采用DIV+CSS,遵循SEO标准。 1.支持中文、英文两种版本,后台可以在不同的环境下编辑中英文。 3.程序和界面分离,提供通用的PHP标准语法字段供前台调用,可以为不同的页面设置不同的风格。 5.支持google地图生成、自定义标题、自定义关键词、自定义描

    下载

                      $("

  • ").html(birthday.toLocaleString()).appendTo("#ulStudents");
                      $("
  • ").html(obj.Birthday.toDate()).appendTo("#ulStudents");
                    });
                });
            });

            //在String对象中扩展一个toDate方法,可以根据要求完善
            String.prototype.toDate = function () {
                var dateMilliseconds;
                if (isNaN(this)) {
                    //使用正则表达式将日期属性中的非数字(D)删除
                    dateMilliseconds =this.replace(/\D/igm, "");
                } else {
                    dateMilliseconds=this;
                }
                //实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数
                return new Date(parseInt(dateMilliseconds));
            };

  • 上面扩展的方法toDate不一定合理,也不够强大,可以根据需要修改。

    方法三:

    可以选择一些第三方的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

    这里以litjson为序列化与反序列化json的工具类作示例,代码如下:

    复制代码 代码如下:

    using System;
    using System.Collections.Generic;
    using System.Web;

    using LitJson;

    namespace JsonDate2
    {
        using System.Linq;

        ///


        /// 学生类,测试用
        ///

        public class Student
        {
            ///
            /// 姓名
            ///

            public String Name { get; set; }

            ///


            /// 生日
            ///

            public DateTime Birthday { get; set; }
        }

        ///


        /// 返回学生集合的json字符
        ///

        public class GetJson : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                //设置服务器响应的结果为纯文本格式
                context.Response.ContentType = "text/plain";
                //学生对象集合
                List students = new List
                {
                    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")}
                };

                //序列化学生集合对象得到json字符
                string studentsJson = JsonMapper.ToJson(students);
                //将字符串响应到客户端
                context.Response.Write(studentsJson);
                context.Response.End();
            }

            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }

    运行结果如下:

    这时候的日期格式就基本正确了,只要在javascript中直接实例化日期就好了,

    var date = new Date("01/31/2014 12:12:12");
    alert(date.toLocaleString());

    客户端的代码如下:

    复制代码 代码如下:

    $(function () {
                $.getJSON("GetJson2.ashx", function (students) {
                    $.each(students, function (index, obj) {
                        $("
  • ").html(obj.Name).appendTo("#ulStudents");

                        var birthday = new Date(obj.Birthday);
                        $("

  • ").html(birthday.toLocaleString()).appendTo("#ulStudents");
                    });
                });
            });

            var date = new Date("01/31/2014 12:12:12");
            alert(date.toLocaleString());

  • 这里讲到了三种解决json中序列化后的日期格式问题,应该还有更好更完善的方法,欢迎您告诉我。因为有很多学生问我所以我写了这点文字,欢迎批评指正。

    示例代码下载

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    Golang处理数据库错误教程合集
    Golang处理数据库错误教程合集

    本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

    67

    2026.02.06

    java多线程方法汇总
    java多线程方法汇总

    本专题整合了java多线程面试题、实现函数、执行并发相关内容,阅读专题下面的文章了解更多详细内容。

    32

    2026.02.06

    1688阿里巴巴货源平台入口与批发采购指南
    1688阿里巴巴货源平台入口与批发采购指南

    本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

    489

    2026.02.06

    快手网页版入口与电脑端使用指南 快手官方短视频观看入口
    快手网页版入口与电脑端使用指南 快手官方短视频观看入口

    本专题汇总了快手网页版的最新入口地址和电脑版使用方法,详细提供快手官网直接访问链接、网页端操作教程,以及如何无需下载安装直接观看短视频的方式,帮助用户轻松浏览和观看快手短视频内容。

    265

    2026.02.06

    C# 多线程与异步编程
    C# 多线程与异步编程

    本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

    18

    2026.02.06

    Python 微服务架构与 FastAPI 框架
    Python 微服务架构与 FastAPI 框架

    本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

    29

    2026.02.06

    JavaScript 异步编程与事件驱动架构
    JavaScript 异步编程与事件驱动架构

    本专题深入讲解 JavaScript 异步编程与事件驱动架构,涵盖 Promise、async/await、事件循环机制、回调函数、任务队列与微任务队列、以及如何设计高效的异步应用架构。通过多个实际示例,帮助开发者掌握 如何处理复杂异步操作,并利用事件驱动设计模式构建高效、响应式应用。

    14

    2026.02.06

    java连接字符串方法汇总
    java连接字符串方法汇总

    本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

    69

    2026.02.05

    java中fail含义
    java中fail含义

    本专题整合了java中fail的含义、作用相关内容,阅读专题下面的文章了解更多详细内容。

    32

    2026.02.05

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    MongoDB 教程
    MongoDB 教程

    共17课时 | 2.7万人学习

    Swoft2.x速学之http api篇课程
    Swoft2.x速学之http api篇课程

    共16课时 | 1.0万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号