使用 WCF 的时区混乱

本文关键字:混乱 时区 WCF 使用 | 更新日期: 2023-09-27 17:56:55

我有一个SaaS系统,在世界各地有多个客户。 但是,每个客户端只在一个时区。 客户端和我的中央服务器之间的通信是使用 WCF 完成的。

现在系统有一个调度方面,时间必须根据本地时间存储。 但是我发现,当我通过 WCF 接口发送一个标记为 DataContract 属性的类时,具有类型 DateTimeDataMember 属性,系统变得太聪明了一半,并且它将时间转换为服务器时间。 OTOH,如果我直接通过 WCF 接口传递 DateTime 值作为参数,则时间将逐字作为客户端时间。

这让我很头疼。 是否可以在某处配置某些内容,以便 WCF 服务不会将任何时间转换为本地(服务器)时间?

编辑:嗯,我不知道我做了什么,但我正在做一些相关的东西,问题似乎只是消失了! 所以我很想试试你的答案,但我现在实际上无法重现我自己的问题......如果我有时间进行学术锻炼,我会更深入地研究,但现在,如果它没有坏掉......

使用 WCF 的时区混乱

WCF 没有任何自动将时间值转换为 UTC 时间的功能。您可以使用和存储应用程序的 UTC 时间。当然,当您在 UI 中显示这些值时,您需要撤消此转换。

我知道

这是一个老问题,但如果有人需要,这里是:

我想你在客户端做DateTime.Now。不要使用此语句,而是使用 :

DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Unspecified)

它获取客户端的本地日期时间,并且不会在服务器中更改。

尝试使用 DateTimeOffset 对象 - 时区偏移量也会被存储,如果时间被转换,您应该能够将其翻译回来。您需要 .NET 3.5 或更高版本。

您必须稍微更改代码,因为 DateTimeOffset 和 DateTime 不能相互转换(它们可以转换)。

您不必更改存储过程调用,但如果您发现需要,SQL Server 中也存在 DateTimeOffset 。