//json日期转换 格式(2015-01-01)

<input class="easyui-datebox" name="sbdj_txtShebaoka_LingquDate" style=" width:180px;height:25px "  id="sbdj_txtShebaoka_LingquDate" data-options="required:true,formatter:myformatter,parser:myparser"></input>

function myformatter(date) {
var y = date.getFullYear();
var m = date.getMonth() + 1;
var d = date.getDate();
return y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d);
}
function myparser(s) {
if (!s) return new Date();
var ss = (s.split('-'));
var y = parseInt(ss[0], 10);
var m = parseInt(ss[1], 10);
var d = parseInt(ss[2], 10);
if (!isNaN(y) && !isNaN(m) && !isNaN(d)) {
return new Date(y, m - 1, d);
} else {
return new Date();
}
}

获取值时还得转换

把取得的值ChangeDateFormat一下 OK 了

var Jianyuan_BeginDate = ChangeDateFormat(result.Jianyuan_BeginDate);

function ChangeDateFormat(jsondate) {
jsondate = jsondate.replace("/Date(", "").replace(")/", "");
if (jsondate.indexOf("+") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("+"));
} else if (jsondate.indexOf("-") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("-"));
}
var date = new Date(parseInt(jsondate, 10));
var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
return date.getFullYear() + "-" + month + "-" + currentDate + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
}
//json日期转换 格式(2015-01获取月份的)

<input class="easyui-datebox" name="txtNext_Pay_Month" style=" width:180px;height:25px "  id="txtNext_Pay_Month"   data-options="required:true,formatter:myformattermonth,parser:myparsermonth"  missingMessage="请输入时间"></input>

function myformattermonth(date) {
var y = date.getFullYear();
var m = date.getMonth() + 1;
return y + '-' + (m < 10 ? ('0' + m) : m);
}
function myparsermonth(s) {
if (!s) return new Date();
var ss = (s.split('-'));
var y = parseInt(ss[0], 10);
var m = parseInt(ss[1], 10);
if (!isNaN(y) && !isNaN(m)) {
return new Date(y, m - 1);
} else {
return new Date();
}
}

function ChangeDateFormatMonth(jsondate) {
jsondate = jsondate.replace("/Date(", "").replace(")/", "");
if (jsondate.indexOf("+") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("+"));
} else if (jsondate.indexOf("-") > 0) {
jsondate = jsondate.substring(0, jsondate.indexOf("-"));
}
var date = new Date(parseInt(jsondate, 10));
var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
return date.getFullYear() + "-" + month;
}

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

           //设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合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")}};//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;/// <summary>/// 学生类,测试用/// </summary>public class Student{/// <summary>/// 姓名/// </summary>public String Name { get; set; }/// <summary>/// 生日/// </summary>public DateTime Birthday { get; set; }}/// <summary>/// 返回学生集合的json字符/// </summary>public class GetJson : IHttpHandler{public void ProcessRequest(HttpContext context){//设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合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);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中的日期对象,代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>json日期格式处理</title><script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"></script><script type="text/javascript">$(function() {$.getJSON("getJson.ashx", function (students) {$.each(students, function (index, obj) {$("<li/>").html(obj.Name).appendTo("#ulStudents");//使用正则表达式将生日属性中的非数字(\D)删除//并把得到的毫秒数转换成数字类型var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数var birthday = new Date(birthdayMilliseconds);$("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;});});});</script>
</head>
<body><h2>json日期格式处理</h2><ul id="ulStudents"></ul>
</body>
</html>

运行结果:

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

$(function () {$.getJSON("getJson.ashx", function (students) {$.each(students, function (index, obj) {$("<li/>").html(obj.Name).appendTo("#ulStudents");//使用正则表达式将生日属性中的非数字(\D)删除//并把得到的毫秒数转换成数字类型var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数var birthday = new Date(birthdayMilliseconds);$("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents");$("<li/>").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;/// <summary>/// 学生类,测试用/// </summary>public class Student{/// <summary>/// 姓名/// </summary>public String Name { get; set; }/// <summary>/// 生日/// </summary>public DateTime Birthday { get; set; }}/// <summary>/// 返回学生集合的json字符/// </summary>public class GetJson : IHttpHandler{public void ProcessRequest(HttpContext context){//设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合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")}};//序列化学生集合对象得到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) {$("<li/>").html(obj.Name).appendTo("#ulStudents");var birthday = new Date(obj.Birthday);$("<li/>").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;}/// <summary>/// 日期格式/// </summary>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");}

运行结果:

"2014-02-03 18:10"

这样就可以完全按自己的意思来设置日期格式了,但需要注意日期格式如平时的Format是有区别的,如这里表示时间的H如果大写表示24小时制,如果小写表示12小时制。另外还有几个问题要问大家:

1、通过Reflector反编译得到的代码中有很多变化,如属性会变成get_Request()方法的形式,不知道大家有没有更好的方法。

2、在反编译得到的代码中使用到了资源文件MvcResources.JsonRequest_GetNotAllowed,怎么在重写时也可以使用?

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

示例代码下载

MVC示例代码下载

转载于:https://www.cnblogs.com/weihengblogs/p/4133415.html

json日期格式问题的办法相关推荐

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

    解决json日期格式问题的3种方法 这篇文章主要介绍了解决json日期格式问题的3种方法 ,需要的朋友可以参考下 开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类 ...

  2. java对象转换为JSON日期格式转换处理

    JSON日期格式转换的时候,默认情况下JSON对date类型会转换成一个多属性对象,如: "createTime":{ "date":11, "day ...

  3. android 解析json 日期格式,如何将JSON格式的日期字符串解析为日期格式

    我正在做的是,使用ajax从数据库中获取数据并在html文本框中显示它以进行更新.下面是我成功获取数据的Web方法代码. [WebMethod] public static List getEmplo ...

  4. ABP .net core2.0 Json 日期格式 和 驼峰设置

    问题描述: 最近采用ABP框架 开发小程序,发现自动生成的动态Web API 接口返回的Json数据格式有两个问题: 1.日期格式问题如:"creationTime": " ...

  5. JSON日期格式转换

    // rs 是对象,只要里面有日期类型,就可以自动转换格式 JSON.toJSONStringWithDateFormat(rs, "yyyy-MM-dd hh:mm:ss", S ...

  6. java+c#+json+时间_Java与C#间json日期格式互转完美解决方案

    作用一种简单方便的数据传输方案,JSON已经成为替代XML的事实标准.然而在JSON中,时间(DateTime,Timestamp,Date等)格式一直没有很好地统一,当需要跨平台序列化/反序列化时, ...

  7. db2有MySQL那样的时间戳_MySQL 按照日期格式查询带有时间戳数据

    按照日期格式查询带有时间戳数据一般在MSQL数据库中的时间都是以时间戳的格式来存储时间的,但是对于我们来说,时间戳格式具体表示的是什么时间,我们很难一眼看出来,所以当我们要具体查询某一个时间或时间段的 ...

  8. 解决MVC返回Json中日期格式问题

    问题:MVC中使用控制器返回JsonResult,如果带有日期字段的对象,浏览器接收到的json中会变成形如/Date('123123123')/格式.如何在easyui等中直接使用是个麻烦事. 解决 ...

  9. json日期格式化 java_java_Java Web程序中利用Spring框架返回JSON格式的日期,返回Json时格式化日期Date 第一 - phpStudy...

    Java Web程序中利用Spring框架返回JSON格式的日期 返回Json时格式化日期Date第一步:创建CustomObjectMapper类 /** * 解决SpringMVC使用@Respo ...

最新文章

  1. 《Adobe Flash Professional CC经典教程》——1.3 使用“库”面板
  2. python读取sqlserver数据库方法_SQLServer数据库之Python读取配置文件,并连接数据库SQL Server...
  3. Eclipse+MyEclipse+Tomcat下配置建立Web Project
  4. Spark分区详解!DT大数据梦工厂王家林老师亲自讲解!
  5. Leetcode 刷题笔记(十七) —— 二叉树篇之公共祖先问题
  6. 17_多易教育之《yiee数据运营系统》用户画像-技术架构方案篇
  7. 常用正则表达式匹配(中文字符)
  8. 计算机上面的清除键是什么符号,电脑上删除键是哪一个
  9. 语音通知事件提醒功能实现流程
  10. 程序开发类本科论文结构【2022年修改】
  11. imo教我们的互联网思维9大玩法
  12. Icebound and Sequence(等比数列公式的递归处理)
  13. NLP 论文领读 | 缺少有标注的数据集怎么训练文本检索模型?来看看 LaPraDoR怎么做的吧
  14. 林群院士:从数学谈教育
  15. wps如何在html中在线浏览器,wps如何设置表格内链接用电脑默认浏览器打开
  16. IPSC和IPSC衍生细胞
  17. 桌面右下角任务栏图标消失问题解决
  18. Swoole 介绍以及三步快速安装 swoole 教程
  19. ubuntu下使用github安装R Packages[已解决]
  20. JAVA使用jcifs读取共享文件夹(SMB1,SMB2协议)

热门文章

  1. 关于前端学习路线的一些建议(值得零基础拥有)
  2. JavaSE01、如何写一个Java代码
  3. 用qpst修复手机服务器禁用,QPST工具包没有qfil怎么办?
  4. jpa oracle 传参int类型判空_企业级Java开发之图解JPA核心构件
  5. android dhcp 脚本,Android adb无线调试脚本
  6. eclipse java jsp_Javaweb学习笔记4 使用Eclipse快速开发JSP
  7. Java实现redis管道
  8. 总结1-深度学习-基础知识学习
  9. 程序员常用字体(vs2008配色方案)
  10. CECC2018赛季收官站我国×××手夺得年度总冠军