0

0

Json操作日期格式

php中世界最好的语言

php中世界最好的语言

发布时间:2018-04-25 17:25:17

|

2000人浏览过

|

来源于php中文网

原创

这次给大家带来Json操作日期格式,Json操作日期格式的注意事项有哪些,下面就是实战案例,一起来看一下。

开发中有时候需要从服务器端返回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); $("
  • ").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());
  • 方法四:

    这点文字发到博客上有网友提出了他们宝贵的意见,我并没有考虑在MVC中的情况,其实MVC中也可以使用handler,所以区别不是很大了,但MVC中有专门针对服务器响应为JSON的Action,代码如下:

    using System;
    using System.Web.Mvc;
    namespace JSONDateMVC.Controllers
    {
     public class HomeController : Controller
     {
     public JsonResult GetJson1()
     {
     //序列化当前日期与时间对象,并允许客户端Get请求
     return Json(DateTime.Now, JsonRequestBehavior.AllowGet);
     }
     }
    }

    运行结果:

    下载一个内容为Application/json的文件,文件名为GetJson1,内容是"\/Date(1391418272884)\/"

    从上面的情况看来MVC中序列化时并未对日期格式特别处理,我们可以反编译看源码:

    Return调用的Json方法:

    protected internal JsonResult Json(object data, JsonRequestBehavior behavior)
    {
     return this.Json(data, null, null, behavior);
    }
    this.Json方法
    protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
    {
     return new JsonResult { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior };
    }

    JsonResult类ActionResult类的子类,ExecuteResult方法:

    从上面的代码中不难看出微软的JsonResult类仍然是使用了JavaScriptSerializer,所以返回的结果与方法一未处理时是一样的,要解决这个问题我们可以派生出一个新的类,重写ExecuteResult方法,使用Json.net来完成序列化工作,JsonResultPro.cs文件的代码如下:

    namespace JSONDateMVC.Common
    {
     using System;
     using System.Web;
     using System.Web.Mvc;
     using Newtonsoft.Json;
     using Newtonsoft.Json.Converters;
     public class JsonResultPro : JsonResult
     {
     public JsonResultPro(){}
     public JsonResultPro(object data, JsonRequestBehavior behavior)
     {
     base.Data = data;
     base.JsonRequestBehavior = behavior;
     this.DateTimeFormat = "yyyy-MM-dd hh:mm:ss";
     }
     public JsonResultPro(object data, String dateTimeFormat)
     {
     base.Data = data;
     base.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
     this.DateTimeFormat = dateTimeFormat;
     }
     /// 
     /// 日期格式
     /// 
     public string DateTimeFormat{ get; set; }
     public override void ExecuteResult(ControllerContext context)
     {
     if (context == null)
     {
     throw new ArgumentNullException("context");
     }
     if ((this.JsonRequestBehavior == JsonRequestBehavior.DenyGet) && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
     { 
     throw new InvalidOperationException("MvcResources.JsonRequest_GetNotAllowed");
     }
     HttpResponseBase base2 = context.HttpContext.Response;
     if (!string.IsNullOrEmpty(this.ContentType))
     {
     base2.ContentType = this.ContentType;
     }
     else
     {
     base2.ContentType = "application/json";
     }
     if (this.ContentEncoding != null)
     {
     base2.ContentEncoding = this.ContentEncoding;
     }
     if (this.Data != null)
     {
     //转换System.DateTime的日期格式到 ISO 8601日期格式
     //ISO 8601 (如2008-04-12T12:53Z)
     IsoDateTimeConverter isoDateTimeConverter=new IsoDateTimeConverter();
     //设置日期格式
     isoDateTimeConverter.DateTimeFormat = DateTimeFormat;
     //序列化
     String jsonResult = JsonConvert.SerializeObject(this.Data,isoDateTimeConverter);
     //相应结果
     base2.Write(jsonResult);
     }
     }
     }
    }

    使用上面的JsonResultPro Action类型的代码如下:

     public JsonResultPro GetJson2()
     {
     //序列化当前日期与时间对象,并允许客户端Get请求,注意H是大写
     return new JsonResultPro(DateTime.Now,"yyyy-MM-dd HH:mm");
     }

    相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    jsonp+json实现AJAX跨域请求

    Jsonp怎样才能解决ajax跨域

    热门AI工具

    更多
    DeepSeek
    DeepSeek

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

    豆包大模型
    豆包大模型

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

    通义千问
    通义千问

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

    腾讯元宝
    腾讯元宝

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

    文心一言
    文心一言

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

    讯飞写作
    讯飞写作

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

    即梦AI
    即梦AI

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

    ChatGPT
    ChatGPT

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

    相关专题

    更多
    php文件怎么打开
    php文件怎么打开

    打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

    2912

    2023.09.01

    php怎么取出数组的前几个元素
    php怎么取出数组的前几个元素

    取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

    1737

    2023.10.11

    php反序列化失败怎么办
    php反序列化失败怎么办

    php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

    1568

    2023.10.11

    php怎么连接mssql数据库
    php怎么连接mssql数据库

    连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

    1120

    2023.10.23

    php连接mssql数据库的方法
    php连接mssql数据库的方法

    php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

    1566

    2023.10.23

    html怎么上传
    html怎么上传

    html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

    1297

    2023.11.03

    PHP出现乱码怎么解决
    PHP出现乱码怎么解决

    PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    1669

    2023.11.09

    php文件怎么在手机上打开
    php文件怎么在手机上打开

    php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

    1310

    2023.11.13

    拼多多赚钱的5种方法 拼多多赚钱的5种方法
    拼多多赚钱的5种方法 拼多多赚钱的5种方法

    在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

    31

    2026.01.26

    热门下载

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

    精品课程

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

    共58课时 | 4.1万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 2.5万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3万人学习

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

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