我有一个称为appointment
的对象,该对象具有两个属性:StartDate
和EndDate
。
当我进行POST
请求时,我使用ISOString
时间发送这些值。
this.appointment.StartDate.toISOString()
在服务器端,我收到了这些属性,具有正确的值。另外,当我创建model
以将appointment
保存到数据库时,这似乎是正确的。我使用了.ToUniversalTime()
方法。
var newAppointment = new Appointment()
{
StartDate =Convert.ToDateTime(model.StartDate).ToUniversalTime(),
EndDate = Convert.ToDateTime(model.EndDate).ToUniversalTime(),
SpecialityId = speciality.Id,
LocationId = location.Id,
PatientId = patient.Id,
UserId = user.Id,
Observations = model.Observations
};
但是在数据库中,我找到了另一个值。可以解释某人为什么这种行为?
例如,我使用2017.09.01 11:00
用于StartDate
,在数据库中我找到了2017-09-01 08:00
服务器和数据库位于westeurope
中。
几件事:
-
不要在Web应用程序中调用
ToUniversalTime
。它旨在将服务器的本地时区域转换为UTC。服务器的时区应与您的应用程序无关。Web应用程序绝不应使用ToUniversalTime
,ToLocalTime
,DateTime.Now
,TimeZoneInfo.Local
,CC_17或使用它运行的计算机时区的任何其他方法。 -
理想情况下,在服务器端,您的
model.StartDate
和model.EndDate
将是是DateTime
对象,因为它们已经被以这种方式进行了序列化。因此,您可能不需要致电Convert.ToDateTime
。如果它们是字符串,那么我将相应地调整您的模型类。 -
在客户端,假设
StartDate
和EndDate
是JavaScriptDate
对象,并且它们是使用本地时间值(即浏览器的时区)创建的,当您调用toISOString
时,您不仅仅是在ISO 8601格式中获取一个字符串 - 它是将其从浏览器的时区转换为UTC。 -
在您的示例中,UTC时间比UTC提前3个小时。从您的个人资料中,我看到您位于罗马尼亚,这确实是UTC 3,因为它目前正在观察东欧的夏季时间。当夏季时间结束时(2017年10月29日,04:00),它将返回UTC 2。因此,您不能简单地向所有值添加三个小时。
-
如果要从客户端发送本地时间值,则应以ISO 8601格式发送它们,,,没有任何
Z
或偏移,例如2017-09-01T11:00
。有几种实现这一目标的方法:-
最好的方法是不要将它们放在
Date
对象中。例如,如果您的输入使用<input type="datetime-local" />
输入类型(如HTML5中指定),则.value
属性不是Date
对象,而是ISO 8601格式中的string
。 -
如果您无法避免
Date
对象,则创建 local ISO字符串,如这样:function dateToLocalISOString(date) { var offset = date.getTimezoneOffset(); var shifted = new Date(date - offset * 60 * 1000); return shifted.toISOString().slice(0, -1); }
或使用Moment.JS:
moment(yourDateObject).format("YYYY-MM-DD[T]HH:mm:ss.SSS")
-
-
最后,您可能会从其他人那里阅读有关将其存储为UTC的建议。不要听。建议"始终使用UTC"是短视的。许多情况需要当地时间。安排约会是当地时间的主要用例。但是,如果您需要在该约会上进行 ACT ,您将使用当前的UTC时间,并且还需要有关约会时区域的一些信息,以便您可以从UTC转换为约会的时区。例如,如果这就像一个面对面的医生办公室约会,那么可以肯定地承担医生办公室的时区。但是,如果这是在线会议的约会,那么您必须单独捕获用户的时区,并在适当的地方将其应用于后端。
问题是您当前的时区。
在这种情况下,您的应用程序要做的是获取当前时区( 3)。
现在它得到了您的时区,但它将转换为UTC时间。因此,会发生什么,您当前的时间将是-3小时。
如果您不适应夏季和冬季,则可以在日期中添加3个小时。否则,您必须获得时区的偏移,并将其添加到当前的DateTime值中。如果您在不同的时区使用此应用程序。例如您的生命在 3中以及 2时区中的其他生活。