2

应用程序正在本地主机上运行。服务器比客户端早一小时!

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

为什么会有一小时的时差,我该如何处理?我猜想这与日光时间与标准时间有关。

当我尝试这段代码时:

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

实际上我只对一天的一部分时间感兴趣。在我的数据库中,我将其保存为日期类型。但是因为这个时差,我的日子提前了一天。

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

我认为这个问答也提到了类似的问题,但我不知道它是否重要:

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

关于 web api odata json 序列化程序,从这篇文章中我可以说它不是这个

这是我的服务器代码:

// 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 补丁请求

4

3 回答 3

1

谜底解开:

数据库中 dateOfArrival 的值为:2015-04-25(仅限日期)
服务器采用该值使其成为:2015-04-24T23:00:00-05:00

在客户端, new Date(dateOfArrival) 给出 2015-04-25T04:00:00.000Z
将此值发送到服务器,服务器使其成为 2015 年 4 月 24 日晚上 11:00:00

服务器接收相同的值。

本文所述,如果日期不在夏令时范围内,例如 2015 年 1 月 1 日,则所有日期都是相同的。

另一方面,当我使用 web api odata 时,它只适用于 DateTimeOffset 而不是 DateTime 我猜这个时区问题会发生

于 2015-05-01T22:31:30.207 回答
1

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

这意味着,在服务器端,您可能需要DateTime.ToUniversalTime()调整日期,或DateTime.UtcNow获取当前日期和时间。

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

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

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

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

于 2015-04-26T02:24:47.600 回答
0

服务器代码在 APP Pool 中用户的用户上下文中运行。
客户端浏览器中的 java 脚本决定了那里的时区。

这些时区可能不同。

于 2015-04-26T00:02:07.917 回答