C# 具有不同时区的.net客户端服务器

C# 具有不同时区的.net客户端服务器,c#,.net,asp.net-mvc-3,C#,.net,Asp.net Mvc 3,我在应用程序上有一个非常奇怪的行为。服务器位于纽约(-5 GMT时区),客户端位于罗马尼亚(+2 GMT时区),因此存在7小时的差异。我面临的问题是,当我试图保存一个日期时,比如说12:00(天不重要),客户端发送一个日期为12:00的请求,12:00到达数据库,但当它返回时,服务器返回的是19:00。我试图在本地调试,看看谁弄乱了日期,但由于我在服务器和客户端上有相同的日期,所以没有差异 这是发送到服务器的参数&startDate=07/25/2012%2012:00:00 这就是结果:134

我在应用程序上有一个非常奇怪的行为。服务器位于纽约(-5 GMT时区),客户端位于罗马尼亚(+2 GMT时区),因此存在7小时的差异。我面临的问题是,当我试图保存一个日期时,比如说12:00(天不重要),客户端发送一个日期为12:00的请求,12:00到达数据库,但当它返回时,服务器返回的是19:00。我试图在本地调试,看看谁弄乱了日期,但由于我在服务器和客户端上有相同的日期,所以没有差异

这是发送到服务器的参数&startDate=07/25/2012%2012:00:00

这就是结果:1343232000000——从纪元开始的秒数(如果你使用转换器——你会看到日期实际上是Wed Jul 25 2012 19:00:00)

以下是一些代码片段:

publicstaticvoid-GetProfessionalsHours(列出ID,列出专业人员)
{
专业人员=新名单();
使用(SqlConnection conn=newsqlconnection(DbConfig.ConnectionString))
{
使用(
SqlCommand command=new SqlCommand(“GetProfessionalsHours”,conn){CommandType=CommandType.StoredProcess})
{
conn.Open();
command.Parameters.AddWithValue(“professionalIDs”,ids.CommaSeparated());
使用(IDataReader=command.ExecuteReader())
{
//得到正常的时间表
while(reader.Read())
{
添加(SalonProfessional.GetSalonProfessional(reader));
}
reader.NextResult();
while(reader.Read())
{
professionals.Find(p=>p.ID==reader.GetInt64(1)).Hours.Add(ProfessionalHours.GetProfessionalHour(reader));
}
//被覆盖的时间
reader.NextResult();
while(reader.Read())
{
professionals.Find(p=>p.ID==reader.GetInt64(1)).overridedHours.Add(professionalsoverridedHour.getprofessionalsoverridedHours(reader));
}
}
}
}
}
公共静态ProfessionalOverridedEnhour GetProfessionalOverridedEnhour(IDataReader阅读器)
{
返回新的时间()
{
ID=reader.GetInt64(0),
Professional ID=reader.GetInt64(1),
StartDate=reader.GetDateTime(2),
EndDate=reader.GetDateTime(3),
};
}
公共JsonResult CalendarData(列出专业ID、CalendarData CalendarData)
{
AjaxResponse=新的AjaxResponse();
回答:成功=正确;
CalendarDataResponseObject responseData=新CalendarDataResponseObject();
响应。内容=响应数据;
尝试
{
List professionals=null;
CalendarOperations.GetProfessionalsHours(ProfessionalID,OutProfessionalID);
响应数据。专业人员=专业人员;
}
捕获(例外情况除外)
{
回答:成功=正确;
response.ErrorMessage=“无法检索日历数据”;
LogException(例如,“无法检索日历数据”);
}
返回Json(response,JsonRequestBehavior.AllowGet);
}

问题出在ProfessionalOverridedEnhour对象的StartDate和EndDate上。

首先参考UTC转换后,尝试存储和检索日期字符串

下面是斯科特·汉塞尔曼的一段摘录

措辞不同,不要使用DateTime。现在用于任何日期计算 使用DateTime.UTCNow并注意 如果你将未来的日期发送给方法,它们会崩溃,这是它们应该做的。 避免在当地时间做任何事情,直到最后一秒,当你 向用户显示日期时间

还可以查看

您可以发送偏移量(z)或商定UTC

    Console.WriteLine(DateTime.Now.ToString("hh mm ss z"));
    Console.WriteLine(DateTime.Now.ToUniversalTime().ToString());

如前所述,在存储日期(在数据库、文件等中)时始终使用UTC,并让客户机自己决定在显示该日期时应使用哪个时区(并且只有在那时!)


当然,只需将时区数据包含在日期字符串中,就可以使其正常工作,但这会使一切变得更复杂(imho),请坚持使用日期始终为UTC的简单情况,除非您将其显示给用户。

非常感谢各位的帮助


问题是服务器和客户端都在将日期转换为本地时间。因此解决方案是在服务器上获取小时差,并将其添加到日期和javascript中,以使用utc时间。基本上,当您不需要时区时,在任何地方都使用utc。除非您不需要,否则服务器将采用本地时间ell则不然。有带时间偏移或时区的日期字符串。如果您按照UTC时间工作,则可能会解决此问题