亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

4種解決json日期格式問題的辦法

2019-11-14 16:51:31
字體:
來源:轉載
供稿:網友

開發中有時候需要從服務器端返回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":"http://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,內容是"http://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示例代碼下載


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合日韩中文字幕v在线| 国产欧美婷婷中文| 91在线观看免费网站| 国产精品女主播视频| 亚洲色在线视频| 亚洲精品在线91| 国产免费一区二区三区在线能观看| 亚洲综合在线做性| 成人在线小视频| 欧美精品18videosex性欧美| 国产99久久精品一区二区 夜夜躁日日躁| 51精品在线观看| 欧美日韩另类字幕中文| 久久99国产综合精品女同| 亚洲无av在线中文字幕| 91久久精品日日躁夜夜躁国产| 欧美日韩国产一区二区三区| 欧美激情亚洲精品| 亚洲国内精品视频| 日韩中文在线观看| 国产精品久在线观看| 国产成人精品电影| 91久久在线播放| 亚洲国产91精品在线观看| 不卡毛片在线看| 中文字幕日韩在线观看| 91深夜福利视频| 欧美精品videosex性欧美| 91av成人在线| 正在播放欧美视频| 欧美做受高潮电影o| 日本精品中文字幕| 欧美精品videos性欧美| 亚洲国内精品在线| 日韩av在线免费观看| 欧美在线www| 久久黄色av网站| 国产精品盗摄久久久| 久久福利网址导航| 亚洲一区二区自拍| 亚洲激情第一页| 97成人在线视频| 欧美另类极品videosbest最新版本| 欧美xxxx18性欧美| 97超碰国产精品女人人人爽| 浅井舞香一区二区| 亚洲一区二区三区乱码aⅴ| 91精品国产91久久久久久久久| 国产精品天天狠天天看| 疯狂做受xxxx欧美肥白少妇| 日韩经典一区二区三区| 国产亚洲精品成人av久久ww| 国产91色在线| 欧美日韩在线观看视频小说| 亚洲一区二区在线| 国产成人在线视频| 国产精品最新在线观看| 久久视频在线观看免费| 日韩免费电影在线观看| 精品日本美女福利在线观看| 日韩欧美福利视频| 最新国产成人av网站网址麻豆| 日韩高清电影免费观看完整版| 美女扒开尿口让男人操亚洲视频网站| 91麻豆国产语对白在线观看| 国产精品亚洲综合天堂夜夜| 91亚洲精品久久久久久久久久久久| 宅男66日本亚洲欧美视频| 亚洲国产欧美一区二区三区同亚洲| 国产欧美中文字幕| 欧美另类老女人| 亚洲人av在线影院| 国产精品视频男人的天堂| 国产精品草莓在线免费观看| 亚洲一二三在线| 97国产真实伦对白精彩视频8| 久久人人爽人人爽人人片av高请| 91性高湖久久久久久久久_久久99| 日本中文字幕久久看| 亚洲日韩欧美视频一区| 日韩精品极品视频| 国产97色在线|日韩| www.久久色.com| 91精品91久久久久久| 91日韩在线视频| 亚洲精品www久久久| 国产精品美女无圣光视频| 97精品国产91久久久久久| 日本一区二区三区在线播放| 欧美精品一区二区三区国产精品| 毛片精品免费在线观看| 成人有码视频在线播放| 美日韩精品免费观看视频| 一本色道久久88精品综合| 国产亚洲精品久久久久久牛牛| 欧美成人免费视频| 日韩电影大片中文字幕| 91精品视频在线免费观看| 色悠悠久久88| 欧美日韩成人网| 97精品视频在线观看| 九色精品免费永久在线| 亚洲成人av片在线观看| 久久久久久亚洲精品中文字幕| 亚洲色图激情小说| 国产一区红桃视频| 久久影院模特热| 国产精品一区二区三| 久久精品国产一区| 久久国产加勒比精品无码| 欧美人与性动交a欧美精品| 55夜色66夜色国产精品视频| 亚洲欧美成人精品| 久久久久久久国产| 亚洲中国色老太| 亚洲免费一级电影| 日韩av在线免费观看| 日韩精品在线观看一区二区| 成人h视频在线| 日本午夜精品理论片a级appf发布| 97碰在线观看| 色99之美女主播在线视频| 国产精品视频白浆免费视频| 国产精品爽爽ⅴa在线观看| 国产精品网站大全| 久久久噜噜噜久噜久久| 国产91在线高潮白浆在线观看| 精品网站999www| 亚洲国产美女精品久久久久∴| 国产精品入口福利| 日韩av电影中文字幕| 国产精品91久久久| **欧美日韩vr在线| 美日韩在线视频| 国产日韩视频在线观看| 欧美一区二区大胆人体摄影专业网站| 日韩精品中文字幕有码专区| 亚洲丝袜av一区| 成人免费视频网址| 欧美精品在线观看| 国产91精品久久久久久| 成人免费自拍视频| 日韩**中文字幕毛片| 97在线精品国自产拍中文| 韩国一区二区电影| 亚洲欧美国产日韩中文字幕| 日本一区二区三区在线播放| 欧美国产日韩在线| 国产精品视频专区| 992tv成人免费视频| 久久精品99久久香蕉国产色戒| 亚洲欧美日韩天堂一区二区| 亚洲成av人乱码色午夜| 久久香蕉精品香蕉| 精品亚洲一区二区三区| 国产精品6699| 亚洲色图综合久久| 尤物yw午夜国产精品视频明星| 国产成人一区二区三区小说| 国产精品视频一区二区三区四| 国产一区二区三区三区在线观看| 亚洲视频专区在线| 最近2019中文字幕大全第二页| 色偷偷偷综合中文字幕;dd|