我的SaaS系统遍布全球,拥有多个客户。但是,每个客户端只在一个时区。客户端和我的中央服务器之间的通信是使用WCF完成的。
现在系统有一个调度方面,时间必须按当地时间存储。但是我发现当我发送一个标记有DataContract
属性的类,通过WCF接口具有类型为DataMember
的{{1}}属性时,系统变得太聪明了一半,它将时间转换为服务器时间。 OTOH,如果我直接通过WCF接口传递DateTime值作为参数,则时间是逐字的,作为客户端时间。
这让我很头疼。我可以在某处配置某些东西,以便WCF服务不会在任何时间转换为本地(服务器)时间吗?
编辑:嗯,我不知道我做了什么,但我正在研究一些相关的东西,问题似乎只是消失了!所以我很想尝试你的答案,但我现在实际上无法重现我自己的问题......如果我有时间进行学术练习,我会更深入,但是现在,如果它没有破产...
答案 0 :(得分:9)
WCF无法自动将时间值转换为UTC时间。您可以为您的应用程序使用并存储UTC time。当然,当您在UI中显示这些值时,您需要undo this conversion。
答案 1 :(得分:4)
我知道这是一个老问题,但如果有人需要,这里就是:
我想你在客户端做DateTime.Now
。而不是使用此语句,请使用:
DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified)
它获取客户端的本地日期时间,并且不会在服务器中更改。
答案 2 :(得分:2)
尝试使用DateTimeOffset对象 - 也会存储时区偏移量,如果时间被翻译,您应该能够将其翻译回来。您需要.NET 3.5或更高版本。
由于DateTimeOffset和DateTime无法相互转换(可以转换),因此您必须稍微更改代码。
您不必更改存储过程调用,但如果您发现需要,SQL Server中也存在DateTimeOffset。