C# 从WCF返回的日期时间不正确;仍然正确显示在前端

C# 从WCF返回的日期时间不正确;仍然正确显示在前端,c#,wcf,C#,Wcf,我们正在部署新的服务器来运行WCFs,并且遇到了。。。在我们目前的环境中,, 生产服务器 TLDR 我们的WCF和前端服务器中的某些东西使它们来回移动存储在数据库中的日期时间。请帮我弄清楚是什么 我们在SQL Server 2016表/列中填写了日期时间,如下所示: (DataAgendamento代表“计划日期”) 存储过程正确地返回它;WCF没有。出于某种奇怪的原因,返回的值向后移动了一小时: 事情变得更加奇怪:我们的前端应用程序(在.NETFramework4.0中运行ASP.NET

我们正在部署新的服务器来运行WCFs,并且遇到了。。。在我们目前的环境中,, 生产服务器

TLDR

我们的WCF和前端服务器中的某些东西使它们来回移动存储在数据库中的日期时间。请帮我弄清楚是什么


我们在SQL Server 2016表/列中填写了日期时间,如下所示:

(DataAgendamento代表“计划日期”)

存储过程正确地返回它;WCF没有。出于某种奇怪的原因,返回的值向后移动了一小时:

事情变得更加奇怪:我们的前端应用程序(在.NETFramework4.0中运行ASP.NETWebForms)从WCF接收这个值,然后。。。加上一个小时。因此,最终,我们得到了“正确”的值 显示

所有项目、WCF或前端的代码中都没有
.AddHour
检查了几次

几句话:

  • WCF和前端目前都在不同的Windows Server 2016物理机器上运行
  • 两个IIS都有葡萄牙语BR全球化设置
  • 存储过程在WCF层执行,并作为
    DataTable
    s完全返回。它的数据在WCF中不会面临任何类型的转换、解析、
    ToString
    ing。前端是这样做的,但在这些处理生效之前,这些值是错误的
  • 不确定是否相关:三十五年来,我们将首次面临一个没有夏时制时间表(通常从11月到2月中旬)的夏天
  • 这种行为已经在几种不同的方法(和程序)中发现
  • 显示日期时间的代码是上图中的Convert.ToDateTime(dataRow[0][“DataAgendamentoFinal”]).ToString(“mm”)
  • 这个bug/notbug场景现在可以工作了,但是新的WCF服务器没有启用这个设置(无论它是什么),所以它正确地返回
    DateTime
    (实际上),只是在前端的结果中添加了一个小时
  • 数据库、WCF和前端服务器在同一时区(GMT-3巴西利亚)运行(谢谢@Sooryan)。这个时区不考虑DST。

  • 非常感谢任何指针。

    当跨时区调用WCF时(WCF服务器端和客户端不在同一时区),WCF会自动将从服务器获取的时间转换为客户端的本地时间。作为一个分布式框架,WCF进行这种转换是明智的。但有时业务逻辑可能不需要这样的时间转换,我们可以将DateTime字段更改为string(在服务器端转换为string),这样可以避免时间自动转换的问题。或者使用UTC时间。以下是关于这个问题的一些讨论。




    如果有什么我可以帮忙的,请随时告诉我。

    我认为您的DB服务器和客户端服务器的时区相同,而WCF服务器的时区差为1小时。。。。我也忘了说这个了。检查过了。这三台服务器在GMT-3(巴西利亚)时区运行。这假设服务器(WCF和前端)不在同一时区。事实并非如此;两者都在GMT-3上运行。话虽如此,去年我们遇到了一些关于DST的问题,最终修补了自动DST收音机。你认为这可能有影响吗?嗯,看来你是对的。为了排除这个因素,我们可以尝试将日期时间数据转换为字符串字段,然后验证结果。