.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-- ...
随机推荐
- TensorFlow 学习(十二)—— 高级函数
tf.map_fn(fn, elems):接受一个函数对象,然后用该函数对象对集合(elems)中的每一个元素分别处理, def preprocessing_image(image, training ...
- 两分钟读懂ThreadLocal
ThreadLocal的工作原理 场景 假设一个用户是一个线程.他们都对数据库进行操作,这个时候就会每个用户就会从数据源中开启一个事务以确保能够顺利的打开或者关闭事务.那么如何保证用户与用户之间的数据 ...
- 报错:Unsupported major.minor version 52.0 (jar包对不同JDK版本的兼容性问题:)
Unsupported major.minor version 52.0 这类错误是因为Java版本不一致造成的,在高版本的JDK(1.8)环境中编译JAR包,然后JAR在低版本的JVM(1.6)中运 ...
- React Native中的DeviceEventEmitter.addListener与DeviceEventEmitter.emit
官方文档没有对这两个方法做很好的解释,需要自己找资料研究.看了几篇文章,总结是和订阅发布模式差不多,用来事件监听发送的. React Native学习之DeviceEventEmitter传值 R ...
- GridLayout网格布局
网格布局特点: l 使容器中的各组件呈M行×N列的网格状分布. l 网格每列宽度相同,等于容器的宽度除以网格的列数. l 网格每行高度相同,等于容器的高度除以网格的行数. l 各组件的排列方式 ...
- spring sts4 如何添加tomcat 服务
spring sts4 ide中已经没有集成tomcat运行服务器了,需要到点击Help-->Eclipse Marketplace中安装 Eclipse JST Server Adapters ...
- 阿里云CentOS7系统搭建JavaWeb环境
一,准备工作 1,安装目录 我们创建如下路径/usr/develop,然后在develop目录下面创建java,tomcat和mysql三个目录即可. 二,配置JDK 1.理解wget命令 wget命 ...
- Extensible File System
An extensible file system format for portable storage media is provided. The extensible file system ...
- centos下载安装mysql,并设置远程访问
思路 获取安装文件→配置好路径→安装→设置权限→处理常见的问题. 1.下载 先建议去官网看看https://dev.mysql.com/,然后根据自己的常识找到下载路径.同时也找到最新版本. 下载方式 ...
- c#调用ffmpeg嵌入srt/ass字幕提示Unable to open xxx.srt......
最近接触到c#调用ffmpeg嵌入srt/ass字幕,碰到一个错误困扰了很久 Unable to open xxx.srt Error initializing filter 'subtitles' ...