C# JavaScriptSerializer序列化时的时间处理详解

最近被序列化困扰了一下下。原因看下面代码

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>
 /// 创建时间
 /// </summary>
 public DateTime CreateDate { get; set; }

 }

输出如下图所示:

猜测这里是由于js初始化时间的时候往往是向 1970/01/01 添加毫秒数,JavaScriptSerializer进行序列化的时候也会格式化为距离1970/01/01 到当该时间点GMT+0 时间的毫秒数,

如果直接反序列化可以看到少了8小时,且时间精度到毫秒,原来初始化的时间精度是10-7 秒。

这种时间格式是适用于js的,但如果我们想把这个信息保存的话,这样的时间格式不适合阅读。因此需要做一下转换。

以下代码利用正则表达式将毫秒数转换成本时区的时间格式:

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);
  //将时间格式转换为适合阅读习惯的格式
  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(); //本地时间
  return dt.ToString(); ;
  });
  return json;
 }
 }

 /// <summary>
 /// 用户类.
 /// </summary>
 public class User
 {
 /// <summary>
 /// 用户Id
 /// </summary>
 public string UserId { get; set; }

 /// <summary>
 /// 创建时间
 /// </summary>
 public DateTime CreateDate { get; set; }
 }

输出:

这样就完成了转换了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#使用JavaScriptSerializer序列化时的时间类型处理

    最近在做一个数据交换服务接口,用的 .NET Web API 项目.需要监控每次请求的数据,也就是操作日志.请求数据为实体对象,所以我用了序列化将请求内容读取并写入日志.咋一看,好像并没有什么问题,但是时间却不是我们平常看到的格式.效果图是这样的: 猜测这里是由于 js 初始化时间的时候往往是向 1970/01/01 添加毫秒数,JavaScriptSerializer 进行序列化的时候也会格式化为距离1970/01/01 到当前时间点 GMT+0 时间的毫秒数,如果直接反序列化可以看到少了8小

  • C#中JavaScriptSerializer帮助类用法实例

    本文实例讲述了C#中JavaScriptSerializer帮助类用法.分享给大家供大家参考.具体如下: 关键代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Web.Script.Serialization; namespace YanZhiwei.DotNet3._5.Utilities.Common {    

  • C# JavaScriptSerializer序列化时的时间处理详解

    最近被序列化困扰了一下下.原因看下面代码 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); C

  • MySQL常用时间函数详解(推荐)

    2.6 DATE_SUB/DATE_ADD DATE_SUB(date,INTERVAL expr type) date 参数是合法的日期表达式.expr 参数是您希望添加的时间间隔. SELECT id FROM my_table WHERE create_time >= date_sub(now(), INTERVAL 3 HOUR) AND create_time < now(); Type 值 •MICROSECOND •SECOND •MINUTE •HOUR •DAY •WEEK

  • mysql常用日期时间/数值函数详解(必看)

    1.日期时间函数 时间转化秒函数:time_to_sec MySQL> select time_to_sec('01:01:01'); +-------------------------+ | time_to_sec('01:01:01') | +-------------------------+ | 3661 | +-------------------------+ 1 row in set (0.00 sec) 秒转化时间函数:sec_to_time mysql> select se

  • Java编程Webservice指定超时时间代码详解

    WebService是一种跨编程语言和跨操作系统平台的远程调用技术 所谓远程调用,就是一台计算机a上的一个程序可以调用到另外一台计算机b上的一个对象的方法,譬如,银联提供给商场的pos刷卡系统(采用交互提问的方式来加深大家对此技术的理解). 远程调用技术有什么用呢?商场的POS机转账调用的转账方法的代码是在银行服务器上,还是在商场的pos机上呢?什么情况下可能用到远程调用技术呢?例如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第

  • java转换时区时间过程详解

    这篇文章主要介绍了java转换时区时间过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一丶时区 由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区. 地球是自西向东自转,东边比西边先看到太阳,东边的时间也比西边的早.东边时刻与西边时刻的差值不仅要以时计,而且还要以分和秒来计算,这给人们带来不便. 为了克服时间上的混乱,1884年在华盛顿召开的一次国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东.西

  • Oracle 生成未来三天的整点时间(步骤详解)

    需求:X坐标轴时间都为整点时间,展示未来三天内的预测(x轴展示未来三天的整点时间),每3个小时一个刻度,横坐标共计24个刻度 步骤一:取当前时间 SELECT SYSDATE FROM DUAL 步骤二:取24个点 SELECT TO_NUMBER(ROWNUM - 1) AS RN,sysdate FROM DUAL CONNECT BY ROWNUM<25 步骤四:Oracle时间加减 SELECT SYSDATE + 1/24 FROM DUAL SYSDATE + 1表示时间加一天,1/

  • PostgreSQL中的日期/时间函数详解

    目录 零.前言 一.获取当前时间 二.时间的加减 三.格式化函数 3.1时间转字符串 3.2字符串转日期 3.3字符串转时间 3.4Unix时间戳转时间 四.一些重要函数 4.1时间间隔 4.2时间截取 五.时间的转换 六.收! 零.前言 公司里有一台阿里云RDS数据库用了PPAS(Postgres PlusTM Advanced Server),在处理日期/时间时遇到一些问题,花了点时间整理如下. 一.获取当前时间 select now() select current_timestamp s

  • java Date和SimpleDateFormat时间类详解

    目录 前言: 一.介绍 二.知识点介绍 三.知识点讲解 1.Date类的声明 2.Date类的常用方法 3.SimpleDateFormat格式化日期 4.精炼练习 4.1 题目 4.2 实验步骤 4.3 代码演示 结语 前言: 任何的收获不是巧合,而是每天的努力与坚持得来的!人生因有梦想而充满动力,不怕你每天迈一小步,只怕你停滞不前:不怕你每天做一点事,只怕你无所事事.坚持,是生命的一种毅力:执行,是努力的一种坚持! 在这钢筋混凝土的森林里,数不尽的豺狼虎豹,能做的就是努力往上爬,一路的打怪升

  • JDBC连接mysql处理中文时乱码解决办法详解

    JDBC连接mysql处理中文时乱码解决办法详解 近日,整合的项目需要跟一个比较老版本的mysql服务器连接,使用navicat查看,发现此mysql服务器貌似没有设置默认编码,而且从操作此mysql的部分php文件看,应该是使用的gb2312的编码,但是,直接使用jdbc操作,从库中读取出来的中文全都是乱码. 一开始,使用类似entity.setDepartName(new String(rs.getString("hg").getBytes("gbk"), &q

随机推荐