.NET Core 1.1日期解析无APi、SQL Server数据转换JSON
前言
在批量导入Excel中的数据时发现出生日期为整数也就是为天数,结果倒腾了翻,这是其一,其二是数据库中的某一列存的是JSON数据,但是场景是为了作为作业来运行,此时不得不将筛选出的数据手动拼接成JSON,给需要的童鞋铺一点路。
日期问题
在Excel中我们给出的出生日期则是正确的日期格式,比如如下:
但是呢,当我们导入数据时发现将其日期转换成了天数,这其实也没什么问题,但是项目是在.NET Core中,则出现了一点问题,在.NET Framework中,如果我们获取到的出生日期是double型数字即天数时,我们该如何将其转换为对应的日期呢,请看如下:
var birthDate = DateTime.FromOADate(33243);
此时我们通过 DateTime.FromOADate 方法能够解析出日期,下面我们再来看看目前.NET Core版本为1.1中的情况:
此时你会发现如下在.NET Core 1.1中并未有此方法。
既然在Excel导入时为天数我们将日期添加天数不就行了吗,在NET Core 1.1中只能通过手动去转换了。我们来看下:
var birthDate = DateTime.Now.AddDays(-33243);
此时得到的日期如下:
我们上述通过.NET Framework中的得到的日期为 1991-01-05 而此时得到的却为 1992-03-06 ,转换失败。上述我们是通过当前日期去减去天数导致转换失败,此时我们改变思路,从某个日期加上这个日期是不是就可以了呢。日期最小从 1899-12-31 开始,所以我们接下来进行下操作:
var birthDate = new DateTime(1899, 12, 31).AddDays(33509);
此时得到的结果如下:
上述演示得到的结果为 1991-09-29 ,而我们在Excel中的日期为 1991-09-28 后经过查阅资料发现,这个是Excel中的一个Bug,此时我们还需要进行如下操作才行。
var days = 33509; if(days>59) days-=1; var birthDate = new DateTime(1899, 12, 31).AddDays(days);
在Excel中的日期多加了一天,类似如下:
想到这里,从正向角度去看待,Excel中我们定义为日期型,而为何会进行转换为天数了呢,我们看看Excel中格式设置。
原来是这样,默认是常规,那么我们是否可以设置自定义日期格式呢。
我们自定义格式为日期格式就不用再去读取时进行转换了,岂不爽哉,我们看看结果:
无论是从根本和利用代码去转换皆可解决问题,上述我们从Excel问题出发估计还保险一点。
SQL Server数据转换为JSON
利用代码转换为JSON简直是SO EASY。但是上述也已经表明了场景,直接通过存储过程筛选数据并将数据存储为JSON字符串来进行短信通知,下面我们来看看,创建测试表。
CREATE TABLE ProductList (Id INT IDENTITY(1,1) PRIMARY KEY, ProductName VARCHAR(500), Price NUMERIC(18,2), Quantity INT, Inserton DATETIME )
插入测试数据:
INSERT INTO ProductList ( ProductName, Price, quantity, Inserton ) VALUES ('Digital camera',20000,5,getdate()),('Laptop',10000,5,getdate())
接下来我们要将其先转换为XML,通过FOR XML PATH,如下:
SELECT * FROM ProductList FOR XML PATH('Jeffcky')
上述就无需我再多讲,FOR XML PATH参数定义为XML根节点名称
展开XML,则是如下XML数据
在SQL Server 2016有了对JSON解析的支持还是挺好,在SQL Server 2012中没有只能借用STUFF函数来拼接了。
DECLARE @content VARCHAR(MAX) SET @content = (SELECT '['+ STUFF( ( SELECT TOP 2 ', {"ProductName": "' + ProductName + '", "Price": "' + CONVERT(VARCHAR, Price) + '", "Quantity": "' + CONVERT(VARCHAR, quantity) + '", "Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList FOR XML PATH('')), 1, 1,'' ) + ']'[ProductDetail]) PRINT @content
此时我们发现多了 
 恰巧应该是换行导致的,我们将其放在一行数据上即可。
DECLARE @content VARCHAR(MAX) SET @content = (SELECT '['+ STUFF((SELECT TOP 2 ',{"ProductName": "' + ProductName + '","Price": "' + CONVERT(VARCHAR, Price) + '","Quantity": "' + CONVERT(VARCHAR, quantity) + '","Inserton": "' + CONVERT(VARCHAR, Inserton, 105) + '"}' FROM ProductList FOR XML PATH('')), 1, 1,'' ) + ']'[ProductDetail]) PRINT @content
此时则能正常输出:
总结
.NET Core 1.1中尚未有将天数转换成日期的APi,期待2.0能有更多的APi供我们使用。

为了方便大家在移动端也能看到我分享的博文,现已注册个人公众号,扫描上方左边二维码即可,欢迎大家关注,有时间会及时分享相关技术博文。
感谢花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让楼主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/CreateMyself)/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构