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

发布时间 - 2026-01-11 02:58:17    点击率:

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

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

输出:

这样就完成了转换了。

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


# C#  # JavaScriptSerializer  # 序列化  # C# 使用multipart form-data方式post数据到服务器  # C#获取本地IP的四种方式示例详解  # C#监测IPv4v6网速及流量的实例代码  # c#获取客户端IP地址(考虑代理)  # C#应用ToolStrip控件使用方法  # C#使用GZipStream实现文件的压缩与解压  # C# 使用SharpZipLib生成压缩包的实例代码  # C#自定义IP输入框控件  # c# 文件压缩zip或将zip文件解压的方法  # C#多线程爬虫抓取免费代理IP的示例代码  # 使用C# 的webBrowser写模拟器时的javascript脚本调用问题  # C#实现文件压缩与解压的方法示例【ZIP格式】  # c# 获得本地ip地址的三种方法  # 也会  # 适用于  # 少了  # 可以看到  # 所示  # 不适合  # 想把  # 转换为  # 大家多多  # 如下图  # 完成了  # 是由于  # 正则表达式  # json  # CreateDate  # serialier  # DateTime  # lt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JS去除重复并统计数量的实现方法  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何快速上传建站程序避免常见错误?  Laravel如何自定义分页视图?(Pagination示例)  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  Laravel如何实现API速率限制?(Rate Limiting教程)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  公司门户网站制作流程,华为官网怎么做?  如何破解联通资金短缺导致的基站建设难题?  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Android利用动画实现背景逐渐变暗  Laravel怎么连接多个数据库_Laravel多数据库连接配置  原生JS获取元素集合的子元素宽度实例  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  nodejs redis 发布订阅机制封装实现方法及实例代码  如何快速生成橙子建站落地页链接?  网站优化排名时,需要考虑哪些问题呢?  中国移动官方网站首页入口 中国移动官网网页登录  如何快速启动建站代理加盟业务?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何获取PHP WAP自助建站系统源码?  大型企业网站制作流程,做网站需要注册公司吗?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Laravel如何实现用户注册和登录?(Auth脚手架指南)  高性能网站服务器配置指南:安全稳定与高效建站核心方案  iOS发送验证码倒计时应用  Python高阶函数应用_函数作为参数说明【指导】  重庆市网站制作公司,重庆招聘网站哪个好?  详解jQuery停止动画——stop()方法的使用  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Python制作简易注册登录系统  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  如何在IIS7中新建站点?详细步骤解析  如何快速建站并高效导出源代码?  Java类加载基本过程详细介绍  如何正确选择百度移动适配建站域名?  JS弹性运动实现方法分析  高端智能建站公司优选:品牌定制与SEO优化一站式服务  js代码实现下拉菜单【推荐】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  Laravel如何实现API资源集合?(Resource Collection教程)  音乐网站服务器如何优化API响应速度?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤