为什么本地主机上的客户端和服务器之间存在时间差
Why is there time difference between client and server on localhost
应用程序在本地主机上 运行。服务器比客户端早一小时!
客户端发送时间: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}
其实我只对一天的一部分时间感兴趣。在我的数据库中,我将其保存为 Date 类型。但是因为这个时差,我的日子早了一天。
我尝试了各种方法来处理问题,但我完全迷失在日期时间转换的世界里!即使我在本地主机应用程序上迷路了,我也无法想象在实时服务器上会发生什么。
我想this Q&A也提到了类似的问题,但我想不通
如果重要:
我的时区:东部时区 (UTC-05:00)
关于网络 api odata json 序列化程序,from this post I could say that it is other then 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 补丁请求
服务器代码在应用程序池中用户的用户上下文中运行。
客户端浏览器中的 java 脚本决定那里的时区。
这些时区可能不同。
为避免客户端和服务器之间的时区差异(或同一台机器内的不同配置),您可能希望使用 UTC 进行任何传输并将其存储在数据库中。
意思是,在服务器端,您可能需要 DateTime.ToUniversalTime()
来调整日期,或 DateTime.UtcNow
来获取当前日期和时间。
从 javascript 开始,使用 moment.js 来简化日期处理可能是个好主意。
使用moment.js,您可以通过以下方式获取 UTC 中的值:
var localDate = new Date();
var inUtc = moment(localDate).utc();
您会以用户的本地偏移向用户显示信息,但始终使用 UTC 发送到服务器并接收回来。
谜底已解:
db 中 dateOfArrival 的值为:2015-04-25(仅限日期)
服务器采用该值使其成为:2015-04-24T23:00:00-05:00
在客户端,新日期 (dateOfArrival) 给出 2015-04-25T04:00:00.000Z
将此值发送到服务器,服务器使其成为 4/24/2015 11:00:00 PM
服务器收到相同的值。
如this post所述,如果日期不在夏令时范围内,例如01/01/2015,则所有日期都相同。
另一方面,当我使用 web api odata 时,因为它只适用于 DateTimeOffset 而不是 DateTime 我猜这个时区问题发生了
应用程序在本地主机上 运行。服务器比客户端早一小时!
客户端发送时间: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}
其实我只对一天的一部分时间感兴趣。在我的数据库中,我将其保存为 Date 类型。但是因为这个时差,我的日子早了一天。
我尝试了各种方法来处理问题,但我完全迷失在日期时间转换的世界里!即使我在本地主机应用程序上迷路了,我也无法想象在实时服务器上会发生什么。
我想this Q&A也提到了类似的问题,但我想不通 如果重要:
我的时区:东部时区 (UTC-05:00)
关于网络 api odata json 序列化程序,from this post I could say that it is other then 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 补丁请求
服务器代码在应用程序池中用户的用户上下文中运行。
客户端浏览器中的 java 脚本决定那里的时区。
这些时区可能不同。
为避免客户端和服务器之间的时区差异(或同一台机器内的不同配置),您可能希望使用 UTC 进行任何传输并将其存储在数据库中。
意思是,在服务器端,您可能需要 DateTime.ToUniversalTime()
来调整日期,或 DateTime.UtcNow
来获取当前日期和时间。
从 javascript 开始,使用 moment.js 来简化日期处理可能是个好主意。
使用moment.js,您可以通过以下方式获取 UTC 中的值:
var localDate = new Date();
var inUtc = moment(localDate).utc();
您会以用户的本地偏移向用户显示信息,但始终使用 UTC 发送到服务器并接收回来。
谜底已解:
db 中 dateOfArrival 的值为:2015-04-25(仅限日期)
服务器采用该值使其成为:2015-04-24T23:00:00-05:00
在客户端,新日期 (dateOfArrival) 给出 2015-04-25T04:00:00.000Z
将此值发送到服务器,服务器使其成为 4/24/2015 11:00:00 PM
服务器收到相同的值。
如this post所述,如果日期不在夏令时范围内,例如01/01/2015,则所有日期都相同。
另一方面,当我使用 web api odata 时,因为它只适用于 DateTimeOffset 而不是 DateTime 我猜这个时区问题发生了