.Net DateTime跨时区相关问题
项目:.Net CS结构,WCF通信,MySql存储。
场景:客户端(UTC+07:00)获取本地时间(DateTime对象)2017-01-17 15:20:12,通过WCF(http)传输至服务端,服务端(UTC+08:00)DateTime对象值变成2017-01-17 16:20:12,由于业务严重依赖字面值(年月日时分秒),所以。。。严重bug。
查询一番发现,是时区相关概念在作怪,以前也没这方面认知,继续查MSDN资料,DateTime是包含了时区相关的信息,只不过有且只有他的Kind属性包含了时区有关的信息,并且是一个枚举:Unspecified,Utc,Local。当通过DateTime.Now获取到的DateTime对象,Kind值即为Local,而我的代码中获取客户端本地时间全部是DateTime.Now这一句。
在.Net解决方案中,当Datetime对象跨时区时(Datetime对象-序列化-反序列化-DateTime)他会根据对象的Kind属性进行不同的处理
当Kind为Local:会进行时区换算,始终将对象值转换为本时区对应的值
当Kind为UTC:不会进行相应转换
当Kind为Unspecified:默认当做UTC方式处理,在某些场景也有区别于UTC
所以,如果你期望DateTime对象的值在跨时区场景中始终保持不变,使用UTC是最好的选择,可以通过DateTime.SpecifyKind方法去修改一个已创建的DateTime对象的Kind值,并且他的Ticks值不变(当从数据库加载DateTime值并已DateTime对象跨时区传输时可以用此方式,貌似应该还有其他方式,可以Google)
我就是用上诉方式解决我遇到的问题的。
其实.Net还提供了DateTimeOffset来处理时区、时间相关的问题,他包含的信息比DateTime丰富,关于他的具体使用,我还没去查看,以及生命夏令时、冬令时相关的东西都没鸟他,滚一边去,以后直接String弄他。
另带:.Net是在序列化和反序列化的时候进行的时区换算,如果是以XmlSerialize来序列化,观察序列化的xml文件就会发现
DateTime.Local会序列化为:2017-01-17T15:20:12.1522145+07:00
DateTime.UTC会序列化为:2017-01-17T15:20:12.1522145Z
以上俩字符串可以通过DateTimeOffset.Parse()方式直接转成DateTimeOffset对象,此对象包含了原始时间和时区等信息,其实当时修复我遇到的问题的第一个想法是在服务端修改,也就是在服务端反序列化之前,将他的值偷偷换了,如此就完成解决(不用发客户端),但直到最好都不知道如何介入WCF那一块,所以最终还是发布了客户端。
具体参见:https://msdn.microsoft.com/zh-cn/library/az4se3k1(v=vs.100).aspx(标准日期和时间格式字符串)
同时提醒一下,MySql的DateTime对象会回毫秒作四舍五入。。。。
记录以上,以待以后查阅。
.Net DateTime跨时区相关问题的更多相关文章
- .NET WebFrom跨时区项目时间问题处理方法
前段时间因为公司的一个 WebFrom 项目设计到跨时区的问题,处理了一段时间,终于解决了,写个博客记录一下,方便以后回顾以及给他人提供一个参考的方法. 本次的项目因为跨越了多个时区,在一些时间上会受 ...
- 一文解决MySQL时区相关问题
前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...
- MySQL5日期类型DATETIME和TIMESTAMP相关问题详解
MySQL5日期类型DATETIME和TIMESTAMP相关问题详解 MySQL5的日期类型有三种:DATETIME.DATE和TIMESTAMP,除了DATE用来表示一个不带时分秒的是日期,另外两个 ...
- C# DateTime的时区
C#中可以通过DateTime的Kind属性指定DateTime的时区 DateTimeKind有3个枚举值: Unspecified:未指定为UTC时间或本地时间 Utc: UTC时间 Local: ...
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...
- WCF跨时区自动转换问题
背景:api端 用wcf做的 客户端是silverlight, 服务和消费 不是同一个时区 状况:客户端调用返回对象有个字段是datetime ,返回的时间和数据库相差好几个小时,找了很久,最后把da ...
- ajax跨域相关
ajax 技术使用xmlhttprequest组件附送请求时,发送请求的url和本网页的url地址必须在同一个域名下如果需要跨域,可以使用iframe或者<javascript src=&quo ...
- 利用SimpleDateFormat进行时间的跨时区转换 - Java
* 次方法主要用来将特定时区的时间转换成指定时区的时间,比如将北京时间“2018-04-08 15:40:49.031”,转换对应的美国东部时间是“2018-04-08 03:40:49.031” ...
- 关于JSONP以及跨域相关
什么是跨域: 浏览器对ajax请求的限制,不允许跨域请求资源. http://www.a.com--->http://www.b.com 是跨域 http://www.a.com-- ...
随机推荐
- TCP协议的一些认识及实践
http://www.2cto.com/net/201210/163047.html 一.简介 引用<TCP/IP详解-卷1>中的介绍,TCP与UDP使用相同的网络层(IP层),TCP却向 ...
- Thread和ThreadPool
Thread和ThreadPool 说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和Thr ...
- [转]mnesia数据库学习笔记
mnesia数据库学习笔记一 mnesia数据库学习笔记二 mnesia数据库学习笔记三 mnesia数据库学习笔记四
- ElasticSearch:分析器
ElasticSearch入门 第七篇:分析器 这是ElasticSearch 2.4 版本系列的第七篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch El ...
- Springboot系列:@SpringBootApplication注解
在使用 Springboot 框架进行开发的时候,通常我们会在 main 函数上添加 @SpringBootApplication 注解,今天为大家解析一下 @SpringBootApplicatio ...
- android仿新浪引导界面
最近在研究如何做出仿微信,仿新浪等应用,第一次安装使用的使用展示应用程序的新特性和用法. 实现功能:左右手势滑屏 底部小圆点随当前显示页跳动 浮动按钮显示.当触屏事件发生显示,否则就渐渐消失 先转个文 ...
- Windows下curl使用
一.简介 在上一篇中我们涉及到了一个在Ubuntu下使用的curl命令,而且使用这个命令来模拟server的功能来向谷歌的C2DMserver发送数据. 以下简单的来说下在Windows下相同的使用c ...
- css3中的渐变小总结
= 导航 顶部 线性渐变 径向渐变 透明度 边框 阴影 顶部 线性渐变 径向渐变 透明度 边框 阴影 系列教程 CSS3 Gradient分为linear-gradient(线性渐变)和r ...
- Vim 写 iOS App
Vim 写 iOS App 我们都知道 Vim 和 Emacs 都是文本编辑器中的上古神器,你也许用 ctags,cscopes 配合 Vim 完成过大型 C 或者 C++ 的开发,你也许配合过其他插 ...
- Javascript中的类实现
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...