项目:.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跨时区相关问题的更多相关文章

  1. .NET WebFrom跨时区项目时间问题处理方法

    前段时间因为公司的一个 WebFrom 项目设计到跨时区的问题,处理了一段时间,终于解决了,写个博客记录一下,方便以后回顾以及给他人提供一个参考的方法. 本次的项目因为跨越了多个时区,在一些时间上会受 ...

  2. 一文解决MySQL时区相关问题

    前言: 在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误.时区不是东八区.程序取得的时间和数据库存储的时间不一致等等问题.其实,这些问题都与数据库时区设置有关,本篇文章将从数据库 ...

  3. MySQL5日期类型DATETIME和TIMESTAMP相关问题详解

    MySQL5日期类型DATETIME和TIMESTAMP相关问题详解 MySQL5的日期类型有三种:DATETIME.DATE和TIMESTAMP,除了DATE用来表示一个不带时分秒的是日期,另外两个 ...

  4. C# DateTime的时区

    C#中可以通过DateTime的Kind属性指定DateTime的时区 DateTimeKind有3个枚举值: Unspecified:未指定为UTC时间或本地时间 Utc: UTC时间 Local: ...

  5. JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决

    JavaScript 解析 Django/Python 生成的 datetime 数据 当Web后台使用Django时,后台生成的时间数据类型就是Python类型的. 项目需要将几个时间存储到数据库中 ...

  6. WCF跨时区自动转换问题

    背景:api端 用wcf做的 客户端是silverlight, 服务和消费 不是同一个时区 状况:客户端调用返回对象有个字段是datetime ,返回的时间和数据库相差好几个小时,找了很久,最后把da ...

  7. ajax跨域相关

    ajax 技术使用xmlhttprequest组件附送请求时,发送请求的url和本网页的url地址必须在同一个域名下如果需要跨域,可以使用iframe或者<javascript src=&quo ...

  8. 利用SimpleDateFormat进行时间的跨时区转换 - Java

    * 次方法主要用来将特定时区的时间转换成指定时区的时间,比如将北京时间“2018-04-08 15:40:49.031”,转换对应的美国东部时间是“2018-04-08 03:40:49.031”   ...

  9. 关于JSONP以及跨域相关

    什么是跨域: 浏览器对ajax请求的限制,不允许跨域请求资源. http://www.a.com--->http://www.b.com       是跨域 http://www.a.com-- ...

随机推荐

  1. 前端Js框架汇总(工具多看)

    前端Js框架汇总(工具多看) 一.总结 一句话总结: 二.前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领 ...

  2. .net core 下的分布式事务锁

    原文:.net core 下的分布式事务锁 目录 系统分布式锁的用法 锁的实现 锁的使用 API内的范例: 引用链接 系统分布式锁的用法 公司框架新增功能分布式锁: 锁的性能之王: 缓存 > Z ...

  3. Redis+Mysql模式和内存+硬盘模式的异同

    http://www.open-open.com/lib/view/open1346029825942.html 学习任何新知识,都是一个循序渐进的过程,从刚开始的懵懂无知,到简单熟悉,然后突然的彻悟 ...

  4. WPF入门(三)->几何图形之不规则图形(PathGeometry) (2)

    原文:WPF入门(三)->几何图形之不规则图形(PathGeometry) (2) 上一节我们介绍了PathGeometry中LineSegment是点与点之间绘制的一条直线,那么我们这一节来看 ...

  5. 【BZOJ 1022】 [SHOI2008]小约翰的游戏John

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1022 [题意] [题解] 和这题类似http://blog.csdn.net/harl ...

  6. CSS布局--左侧自适应母元素高度

    平常项目中经常会遇到有左侧导航菜单的高度不固定,需要与母元素或右侧元素等高的情况,以前就自以为是的使用js来设置,不仅不方便还会出现各种bug,后来就突然想到了一个好方法.有可能这方法已经被其他人用烂 ...

  7. 【t071】最长路

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n.设w[i,j]为边的长度.请计算图G中从1到n ...

  8. 使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能。并且在界面上有radio 的选择内容也要上传

    使用 jquery 的 上传文件插件 uploadify 3.1 配合 java 来做一个简单的文件上次功能.并且在界面上有radio 的选择内容也要上传 uploadify 插件的 下载和文档地址  ...

  9. IIS执行原理

    IIS执行原理   服务器的监听(IIS6.0+版本) 当请求到达服务器时,请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序的请求队列中(可以理解为 ...

  10. 从Client应用场景介绍IdentityServer4(五)

    原文:从Client应用场景介绍IdentityServer4(五) 本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置. 一.新建 ...