转换json格式的日期为Javascript对象的函数

news/2024/3/29 21:39:24/文章来源:https://blog.csdn.net/cdming/article/details/130356615

项目中碰到了用jQuery从后台获取的json格式的日期的字符串,需要将此字符串转换成JavaScript的日期对象。

代码如下:

//转换json格式的日期(如:{ServerDatetime:"\/Date(1278930470649)\/"})为Javascript的日期对象 
function ConvertJSONDateToJSDateObject(JSONDateString) { 
var date = new Date(parseInt(JSONDateString.replace("/Date(", "").replace(")/", ""), 10)); 
return date; 
} 

解决json日期格式问题的3种方法

开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示:

代码如下:

//设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合List<Student> students = new List<Student>{new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}};//javascript序列化器JavaScriptSerializer jss=new JavaScriptSerializer();//序列化学生集合对象得到json字符string studentsJson=jss.Serialize(students);//将字符串响应到客户端context.Response.Write(studentsJson);context.Response.End();

运行结果是:

其中Tom所对应生日“2014-01-31”变成了1391141532000,这其实是1970 年 1 月 1 日至今的毫秒数;1391141532000/1000/60/60/24/365=44.11年,44+1970=2014年,按这种方法可以得出年月日时分秒和毫秒。这种格式是一种可行的表示形式但不是普通人可以看懂的友好格式,怎么让这个格式变化?

解决办法:

方法1:在服务器端将日期格式使用Select方法或LINQ表达式转换后发到客户端:

代码如下:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Script.Serialization;
namespace JsonDate1
{using System.Linq;/// <summary>/// 学生类,测试用/// </summary>public class Student{/// <summary>/// 姓名/// </summary>public String Name { get; set; }/// <summary>/// 生日/// </summary>public DateTime Birthday { get; set; }}/// <summary>/// 返回学生集合的json字符/// </summary>public class GetJson : IHttpHandler{public void ProcessRequest(HttpContext context){//设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合List<Student> students = new List<Student>{new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}};//使用Select方法重新投影对象集合将Birthday属性转换成一个新的属性//注意属性变化后要重新命名,并立即执行var studentSet =students.Select(p => new { p.Name, Birthday = p.Birthday.ToString("yyyy-mm-dd") }).ToList();//javascript序列化器JavaScriptSerializer jss = new JavaScriptSerializer();//序列化学生集合对象得到json字符string studentsJson = jss.Serialize(studentSet);//将字符串响应到客户端context.Response.Write(studentsJson);context.Response.End();}public bool IsReusable{get{return false;}}}
}

Select方法重新投影对象集合将Birthday属性转换成一个新的属性,注意属性变化后要重新命名,属性名可以相同;这里可以使用select方法也可以使用LINQ查询表达式,也可以选择别的方式达到相同的目的;这种办法可以将集合中客户端不用的属性剔除,达到简单优化性能的目的。 
运行结果:

这时候的日期格式就已经变成友好格式了,不过在javascript中这只是一个字符串。

方法二:

在javascript中将"Birthday":"\/Date(1391141532000)\/"中的字符串转换成javascript中的日期对象,可以将Birthday这个Key所对应的Value中的非数字字符以替换的方式删除,到到一个数字1391141532000,然后实例化一个Date对象,将1391141532000毫秒作为参数,得到一个javascript中的日期对象,代码如下:

代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>json日期格式处理</title><script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"></script><script type="text/javascript">$(function() {$.getJSON("getJson.ashx", function (students) {$.each(students, function (index, obj) {$("<li/>").html(obj.Name).appendTo("#ulStudents");//使用正则表达式将生日属性中的非数字(\D)删除//并把得到的毫秒数转换成数字类型var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数var birthday = new Date(birthdayMilliseconds);$("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;});});});</script>
</head>
<body><h2>json日期格式处理</h2><ul id="ulStudents"></ul>
</body>
</html>

运行结果:

上的使用正则/\D/igm达到替换所有非数字的目的,\D表示非数字,igm是参数,分别表示忽视(ignore)大小写;多次、全局(global)替换;多行替换(multi-line);有一些时候还会出现+86的情况,只需要变换正则同样可以达到目的。另外如果项目中反复出现这种需要处理日期格式的问题,可以扩展一个javascript方法,代码如下:

代码如下:

$(function () {$.getJSON("getJson.ashx", function (students) {$.each(students, function (index, obj) {$("<li/>").html(obj.Name).appendTo("#ulStudents");//使用正则表达式将生日属性中的非数字(\D)删除//并把得到的毫秒数转换成数字类型var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数var birthday = new Date(birthdayMilliseconds);$("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents");$("<li/>").html(obj.Birthday.toDate()).appendTo("#ulStudents");});});});//在String对象中扩展一个toDate方法,可以根据要求完善String.prototype.toDate = function () {var dateMilliseconds;if (isNaN(this)) {//使用正则表达式将日期属性中的非数字(\D)删除dateMilliseconds =this.replace(/\D/igm, "");} else {dateMilliseconds=this;}//实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数return new Date(parseInt(dateMilliseconds));};

上面扩展的方法toDate不一定合理,也不够强大,可以根据需要修改。

方法三:

可以选择一些第三方的json工具类,其中不乏有一些已经对日期格式问题已处理好了的,常见的json序列化与反序列化工具库有:

1.fastJSON.
2.JSON_checker.
3.Jayrock.
4.Json.NET - LINQ to JSON.
5.LitJSON.
6.JSON for .NET.
7.JsonFx.
8.JSONSharp.
9.JsonExSerializer.
10.fluent-json
11.Manatee Json

这里以litjson为序列化与反序列化json的工具类作示例,代码如下:

代码如下:

using System;
using System.Collections.Generic;
using System.Web;
using LitJson;
namespace JsonDate2
{using System.Linq;/// <summary>/// 学生类,测试用/// </summary>public class Student{/// <summary>/// 姓名/// </summary>public String Name { get; set; }/// <summary>/// 生日/// </summary>public DateTime Birthday { get; set; }}/// <summary>/// 返回学生集合的json字符/// </summary>public class GetJson : IHttpHandler{public void ProcessRequest(HttpContext context){//设置服务器响应的结果为纯文本格式context.Response.ContentType = "text/plain";//学生对象集合List<Student> students = new List<Student>{new Student(){Name ="Tom",Birthday =Convert.ToDateTime("2014-01-31 12:12:12")},new Student(){Name ="Rose",Birthday =Convert.ToDateTime("2014-01-10 11:12:12")},new Student(){Name ="Mark",Birthday =Convert.ToDateTime("2014-01-09 10:12:12")}};//序列化学生集合对象得到json字符string studentsJson = JsonMapper.ToJson(students);//将字符串响应到客户端context.Response.Write(studentsJson);context.Response.End();}public bool IsReusable{get{return false;}}}
}

运行结果如下:

这时候的日期格式就基本正确了,只要在javascript中直接实例化日期就好了,

var date = new Date("01/31/2014 12:12:12");
alert(date.toLocaleString());

客户端的代码如下:

代码如下:

$(function () {$.getJSON("GetJson2.ashx", function (students) {$.each(students, function (index, obj) {$("<li/>").html(obj.Name).appendTo("#ulStudents");var birthday = new Date(obj.Birthday);$("<li/>").html(birthday.toLocaleString()).appendTo("#ulStudents");});});});var date = new Date("01/31/2014 12:12:12");alert(date.toLocaleString());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103574.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux tail 命令

前言 Linux 实时查看日志文件&#xff0c;最主要使用的就是tail命令。 linux tail命令用于显示文件尾部的内容&#xff0c;默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”…

湿法冶金以及铼提取工艺,湿法冶金工艺特点及工艺流程

湿法冶金是利用浸出剂在一定温度压力下与矿石接触&#xff0c;把矿石中有用的金属溶解后再从溶液中回收有价金属的一种工艺&#xff0c;因为其过程大都是在水溶液中进行&#xff0c;所以又被称为“水法冶金”。 01 湿法冶金工艺特点及工艺流程 湿法冶金作为解决我国金属矿产资…

深度赋能产业数字化转型,蚂蚁集团数字化三件套亮相中国国际金融展

“十四五”规划纲要指出&#xff1a;加快推动数字产业化&#xff0c;推进产业数字化转型&#xff0c;实施“上云用数赋智”行动&#xff0c;推动数据赋能全产业链协同转型。明确提出了通过科技创新&#xff0c;加快产业数字化转型的要求。 4月25日&#xff0c;以“荟萃金融科技…

mybatisPlus·入门·贰

文章目录 1 简单CRUD接口1.1 根据id查询&#xff08;{id传参&#xff09;1.1.1 接口类直接继承IService1.1.2 controller直接调用方法 1.2 根据ids查询1.3 新增1.3.1 接口类直接继承IService1.3.2 controller直接调用方法 1.4 修改状态&#xff08;Query传参&#xff09;1.4.1 …

新版Fluent默认保存的h5文件无法用Tecplot打开的解决办法(亲试有效,评论区是重点)

文章目录 Ansys Fluent简介Fluent 输入/出 文件格式新版Fluent的输出压缩文件&#xff08;.cas.h5文件&#xff09;解决办法 Ansys Fluent简介 Ansys Fluent &#xff0c;是国际上比较流行的商用CFD软件包&#xff0c;在美国的市场占有率为60%&#xff0c;凡是和流体、热传递和…

NetXpert XG2帮您解决“布线安装与维护”难题

在传输大量数据时&#xff0c;光纤变得越来越重要&#xff0c;而铜缆在未来也将继续发挥重要作用&#xff0c;因此我们不仅要比较两种类型布线的优缺点&#xff0c;还要探究光纤传输中的错误来源。 测试光缆传输损耗的准确性对于故障排除至关重要&#xff0c;特别是在光纤情况下…

后台-husky提交代码规范使用

husky是一个git hook工具&#xff0c;可以帮助我们触发git提交的各个阶段&#xff1a;pre-commit、commit-msg、pre-push 1.如何使用husky呢&#xff1f; npx husky-init && npm installWindows安装不成功试试npx husky-init && npm install 2.git commit规范…

Java学习笔记-01

目录 jdk安装及环境配置 java前置知识 编写一个HelloWorld 常量 数据类型 变量 类型转换 算数运算符 一元运算符( --) 关系运算符 逻辑运算符(与或非&#xff0c;逻辑异或) 三元(三目)运算符 Scanner类的简单使用 jdk安装及环境配置 看到的一篇文章&#xff0c;…

【C++STL】set

前言 前面的CSTL的博客&#xff0c;我们介绍了string&#xff0c;vector&#xff0c;list&#xff0c;deque&#xff0c;priority_queue还有stack和queue。 这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 而从本节开…

(二)ElasticSearch 辅助工具 Kibana 介绍与安装

1、什么是 kibana &#xff1f; Kibana 是一个针对Elasticsearch的开源分析及可视化平台&#xff0c;用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana&#xff0c;可以通过各种图表进行高级数据分析及展示。 Kibana让海量数据更容易理解。它操作简单&#xff…

0401概述-最短路径-加权有向图-数据结构和算法(Java)

文章目录 1 最短路径2 最短路径的性质3 加权有向图的数据结构3.1 加权有向边3.2 加权有向图 4 最短路径4.1 最短路径API4.2 最短路径的数据结构4.3 边的松弛4.4 顶点的松弛 结语 1 最短路径 如图1-1所示&#xff0c;一幅加权有向图和其中的一条最短路径&#xff1a; 定义&…

加强人工智能共性技术研发与产业化协同发展

央视网消息&#xff1a;“以5G为代表的新一代信息技术与制造业、交通、旅游等实体经济重要领域深度融合。”4月20日下午&#xff0c;国新办举行一季度工业和信息化发展情况新闻发布会&#xff0c;相关部门负责人在答问时表示&#xff0c;将用好融合应用这把金钥匙&#xff0c;开…

基于matlab仿真相控天线阵列在波束成形MIMO-OFDM系统中的使用

一、前言 本例显示了相控阵在采用波束成形的MIMO-OFDM通信系统中的使用。它使用通信工具箱和相控阵系统工具箱中的组件&#xff0c;对组成发射器和前端接收器组件的辐射元件进行建模&#xff0c;用于MIMO-OFDM通信系统。使用用户指定的参数&#xff0c;您可以根据不同空间位置和…

JAVA Future类详解及Thread线程是如何运行Future类的

一、Future基本介绍 Future(java.util.concurrent Interface Future<V>)表示异步计算的结果。Future接口提供了检查计算是否完成、检查计算是否被取消、等待计算完成并获取计算结果等方法。 在并发编程中&#xff0c;我们经常用到非阻塞的模型&#xff0c;但继承thread类…

202303-1 田地丈量

代码 #include<iostream> #include<vector> #include<string> #include<cmath> #include<algorithm> #include<stack> using namespace std; int n, a, b;int main() {cin >> n >> a >> b;int x1, y1, x2, y2;int x, y;…

网络基础之网络传输基本流程

网络基础 此小节介绍网络基础概念 首先要明确的是 网络是层状结构&#xff01;分层->OP->解耦 网络发展&#xff1a;最早的时候&#xff0c;每台计算机之间是相互独立的。后续发展到网络互联&#xff0c;就是将多台计算机连接在一起&#xff0c;完成数据共享。 协议&…

19.Java文件操作---I/O流

Java文件操作—I/O流 流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中&#xff0c;管道是一条不间断的字节流&#xff0c;用来实现程序或进程间的通信&#xff0c;或读写外围设备、外部文件等。一个流&#xff0c;必有源端和目的端&#xff0c;它们可以是计算机内存的某…

【问题记录】docker 搭建 minio

一、搭建过程 docker 搜索minio镜像 docker search miniodocker 拉取镜像 docker pull minio/miniodocker 启动 minio docker run -p 9900:9900 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_KEY1qazWSX -v /usr/local/minio/data:/data -v …

PHP入门【1】环境搭建

目录 一&#xff0c;安装appserv组合包 二&#xff0c;运行第一个php程序 一&#xff0c;安装appserv组合包 组合包&#xff1a;将apache&#xff0c;mysql&#xff0c;php等服务器软件和工具安装配置完成后打包处理 组合包大大提高了我们的效率&#xff0c;不需要为配置环境…

MACH SYSTEMS操作手册 SAEJ2716(SENT) to RS-232/CAN Gateway怎么使用?

双通道SAE J2716 (SENT)至RS-232/CAN总线网关&#xff0c;具有两个双向SENT通道和RS-232 (SENT-RS232) 或CAN总线 (SENT-CAN) 接口。两种变体还提供两个模拟输出&#xff0c;可以直接将输入SENT数据转换为模拟电压。该网关配备了一个免费的PC应用程序&#xff0c;用于SENT通信分…