Json中对日期的处理

前言:Json对日期的处理很特别,我们不能简单的转换而得到我们想要的结果,需要进行特殊处理

一、JSon序列化和反序列化对日期的处理

JsonHelper类:

using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;

namespace MVCEFDbFirstTutotrials.Common
{
    public class JsonHelper
    {
        public static void Test()
        {
            Product product = new Product()
            {
                Name = "11",
                Description = "11",
                Price = 12,
                Color = "color",
                PublishOn = DateTime.Now
            };
            string jsonString = JsonSerializer<Product>(product);
            Product product1 = JsonDeserialize<Product>(jsonString);
        }

        /// <summary>    
        /// JSON序列化    
        /// </summary>    
        public static string JsonSerializer<T>(T t)
        {
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream();
            ser.WriteObject(ms, t);
            string jsonString = Encoding.UTF8.GetString(ms.ToArray());
            ms.Close();
            //替换Json的Date字符串                
            string p = @"Date/((/d+)/+/d+/)///"; 
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            return jsonString;
        }    
        /// <summary>    
        /// JSON反序列化    
        /// </summary>    
        public static T JsonDeserialize<T>(string jsonString)
        {
            //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"//Date(1294499956278+0800)//"格式    
            string p = @"d{4}-d{2}-d{2}sd{2}:d{2}:d{2}";
            MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
            Regex reg = new Regex(p);
            jsonString = reg.Replace(jsonString, matchEvaluator);
            DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            T obj = (T)ser.ReadObject(ms);
            return obj;
        }

        /// <summary>    
        /// 将Json序列化的时间由/Date(1294499956278+0800)转为yyyy-MM-dd HH:mm:ss字符串    
        /// </summary>    
        private static string ConvertJsonDateToDateString(Match m)
        {
            string result = string.Empty;
            DateTime dt = new DateTime(1970, 1, 1);
            dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
            dt = dt.ToLocalTime();
            result = dt.ToString("yyyy-MM-dd HH:mm:ss");
            return result;
        }
        /// <summary>    
        /// 将时间字符串转为Json时间    
        /// </summary>    
        private static string ConvertDateStringToJsonDate(Match m)
        {
            string result = string.Empty;
            DateTime dt = DateTime.Parse(m.Groups[0].Value);
            dt = dt.ToUniversalTime();
            TimeSpan ts = dt - DateTime.Parse("1970-01-01");
            result = string.Format("\/Date({0}+0800)\/", ts.TotalMilliseconds);
            return result;
        }
    }  

}

二、前台对返回的/Date(1294499956278+0800) /日期格式进行处理:

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;
   }

简单Demo: ChangeDateFormat("/Date(1294499956278+0800)/");

结果: 2011-1-8

原文地址:https://www.cnblogs.com/panbin/p/5584609.html