为什么localhost上的客户端和服务器之间存在时间差异

时间:2015-04-25 23:43:35

标签: .net datetime asp.net-web-api2 asp.net-web-api-odata

应用程序在localhost上运行。服务器比客户早一个小时!

客户发送时间:Sat Apr 25 2015 00:00:00 GMT-0400 (Eastern Daylight Time)

enter image description here

发送请求:dateOfArrival: "2015-04-25T04:00:00.000Z"

enter image description here

服务器收到时间:{4/24/2015 11:00:00 PM}

enter image description here

为什么之间有一个小时的差异?我该如何处理它?我猜可能它与Daylight时间和Standart时间有关。

当我尝试这段代码时:

string dateStr = "2015-04-25T04:00:00.000Z";  
var myDate = DateTime.Parse(dateStr);  // it gives me myDate = {4/25/2015 12:00:00 AM}

实际上我只对一天的时间感兴趣。在我的数据库中,我将其作为日期类型。但由于这个时差,我的日子就在前一天。

我尝试了各种方法处理问题,但我在日期转换世界中完全迷失了!即使我在localhost应用程序中迷失了,我也无法想象在实时服务器上会发生什么。

我认为this Q&A也提到了类似的问题,但我无法弄清楚 如果重要:

我的时区:东部时区(UTC-05:00)

关于web api odata json序列化程序,from this post我可以说它不是this one

这是我的服务器代码:

// PATCH: odata/IncomingStudents(5)
[AcceptVerbs("PATCH", "MERGE")]
public async Task<IHttpActionResult> Patch([FromODataUri] int key, Delta<IncomingStudent> patch)
{
    Validate(patch.GetEntity());
    var dateOfArrival = patch.GetEntity().DateOfArrival
... 
}

客户端是angularjs发送http补丁请求

2 个答案:

答案 0 :(得分:1)

为避免客户端和服务器之间的时区差异(或同一台计算机内的不同配置),您可能希望将UTC用于任何传输并将其存储在数据库中。

意思是,在服务器端,您可能需要DateTime.ToUniversalTime()来调整日期,或DateTime.UtcNow来获取当前日期&amp;时间。

从javascript中使用moment.js来简化日期处理可能是个好主意。

使用moment.js,您可以通过以下方式获取UTC中的值:

var localDate = new Date();
var inUtc = moment(localDate).utc();

您将以本地偏移量向用户显示信息,但始终会发送到服务器并使用UTC接收回来。

答案 1 :(得分:0)

服务器代码与APP池中用户的用户上下文一样运行 客户端浏览器中的java脚本确定那里的时区。

这些时区可能会有所不同。

相关问题