C# JavaScriptSerializer序列化時(shí)的時(shí)間處理詳解
最近被序列化困擾了一下下。原因看下面代碼
class Program
{
static void Main(string[] args)
{
var user = new User { UserId = "sb", CreateDate = DateTime.Now };
var serialier = new JavaScriptSerializer();
var json = serialier.Serialize(user);
Console.WriteLine(json);
Console.Read();
}
}
/// <summary>
/// 用戶類.
/// </summary>
public class User
{
/// <summary>
/// 用戶Id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 創(chuàng)建時(shí)間
/// </summary>
public DateTime CreateDate { get; set; }
}
輸出如下圖所示:

猜測(cè)這里是由于js初始化時(shí)間的時(shí)候往往是向 1970/01/01 添加毫秒數(shù),JavaScriptSerializer進(jìn)行序列化的時(shí)候也會(huì)格式化為距離1970/01/01 到當(dāng)該時(shí)間點(diǎn)GMT+0 時(shí)間的毫秒數(shù),
如果直接反序列化可以看到少了8小時(shí),且時(shí)間精度到毫秒,原來(lái)初始化的時(shí)間精度是10-7 秒。
這種時(shí)間格式是適用于js的,但如果我們想把這個(gè)信息保存的話,這樣的時(shí)間格式不適合閱讀。因此需要做一下轉(zhuǎn)換。
以下代碼利用正則表達(dá)式將毫秒數(shù)轉(zhuǎn)換成本時(shí)區(qū)的時(shí)間格式:
class Program
{
static void Main(string[] args)
{
var user = new User { UserId = "sb", CreateDate = DateTime.Now };
var serialier = new JavaScriptSerializer();
var json = serialier.Serialize(user);
var jsonNomal = LocalSerialize(user);
Console.WriteLine("js序列化:" + json);
Console.WriteLine("本地序列化:" + jsonNomal);
Console.Read();
}
public static string LocalSerialize(object obj)
{
var jser = new JavaScriptSerializer();
var json = jser.Serialize(obj);
//將時(shí)間格式轉(zhuǎn)換為適合閱讀習(xí)慣的格式
json = Regex.Replace(json, @"\\/Date\((\d+)\)\\/", match =>
{
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(match.Groups[1].Value));
dt = dt.ToLocalTime(); //本地時(shí)間
return dt.ToString(); ;
});
return json;
}
}
/// <summary>
/// 用戶類.
/// </summary>
public class User
{
/// <summary>
/// 用戶Id
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 創(chuàng)建時(shí)間
/// </summary>
public DateTime CreateDate { get; set; }
}
輸出:

這樣就完成了轉(zhuǎn)換了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C# 使用multipart form-data方式post數(shù)據(jù)到服務(wù)器
- C#獲取本地IP的四種方式示例詳解
- C#監(jiān)測(cè)IPv4v6網(wǎng)速及流量的實(shí)例代碼
- c#獲取客戶端IP地址(考慮代理)
- C#應(yīng)用ToolStrip控件使用方法
- C#使用GZipStream實(shí)現(xiàn)文件的壓縮與解壓
- C# 使用SharpZipLib生成壓縮包的實(shí)例代碼
- C#自定義IP輸入框控件
- c# 文件壓縮zip或?qū)ip文件解壓的方法
- C#多線程爬蟲抓取免費(fèi)代理IP的示例代碼
- 使用C# 的webBrowser寫模擬器時(shí)的javascript腳本調(diào)用問(wèn)題
- C#實(shí)現(xiàn)文件壓縮與解壓的方法示例【ZIP格式】
- c# 獲得本地ip地址的三種方法
相關(guān)文章
Unity實(shí)現(xiàn)簡(jiǎn)單的多人聊天工具
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)簡(jiǎn)單的多人聊天工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C#實(shí)現(xiàn)通過(guò)winmm.dll控制聲音播放的方法
這篇文章主要介紹了C#實(shí)現(xiàn)通過(guò)winmm.dll控制聲音播放的方法,很實(shí)用的功能,需要的朋友可以參考下2014-08-08
WPF利用CommunityToolkit.Mvvm實(shí)現(xiàn)級(jí)聯(lián)選擇器
這篇文章主要介紹了WPF如何利用CommunityToolkit.Mvvm實(shí)現(xiàn)級(jí)聯(lián)選擇器,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定幫助,需要的小伙伴可以參考一下2023-12-12
C#中加載dll并調(diào)用其函數(shù)的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇C#中加載dll并調(diào)用其函數(shù)的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Unity3D使用Shader實(shí)現(xiàn)腐蝕消失
這篇文章主要為大家詳細(xì)介紹了Unity3D使用Shader實(shí)現(xiàn)腐蝕消失,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Winform界面中實(shí)現(xiàn)通用工具欄按鈕的事件處理方法
下面小編就為大家分享一篇Winform界面中實(shí)現(xiàn)通用工具欄按鈕的事件處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11
C#實(shí)現(xiàn)簡(jiǎn)單的點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單的點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

