Json中对日期的处理

时间:2022-04-11 22:08:18

前言: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}\s\d{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