我有一个名为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
。
答案 0 :(得分:1)
一些事情:
不要在网络应用程序中调用ToUniversalTime
。它旨在将服务器的本地时区转换为UTC。服务器的时区应该与您的应用程序无关。 Web应用程序绝不应使用ToUniversalTime
,ToLocalTime
,DateTime.Now
,TimeZoneInfo.Local
,DateTimeKind.Local
或任何其他使用计算机时区的方法。正在运行。
理想情况下,在服务器端,您的model.StartDate
和model.EndDate
已已成为DateTime
个对象,因为他们已经以这种方式反序列化。因此,您可能不需要致电Convert.ToDateTime
。如果它们是字符串,那么我会相应地调整您的模型类。
在客户端,假设StartDate
和EndDate
是JavaScript Date
对象,并且它们是使用本地时间值(即浏览器的时区)创建的),当您致电toISOString
时,您不仅要获得ISO 8601格式的字符串 - 还将其从浏览器的时区转换为UTC。
在您的示例中,UTC时间比UTC显示的日期和时间提前3小时。从您的个人资料中,我看到您位于罗马尼亚,这个日期确实是UTC + 3,因为它目前正在观察东欧夏令时。当夏令时结束(on October 29, 2017 at 04:00)时,它将返回UTC + 2。因此,您不能简单地为所有值添加三个小时。
如果要从客户端发送本地时间值,则应以ISO 8601格式发送它们,不带任何Z
或偏移量,例如{{1} }。有几种方法可以实现这一目标:
最好的方法是不要在2017-09-01T11:00
对象中开始使用它们。例如,如果您的输入使用Date
输入类型(as specified in HTML5),则<input type="datetime-local" />
属性不是.value
对象,而是ISO 8601格式的Date
如果您无法避开string
个对象,请创建本地 ISO字符串,如下所示:
Date
或,使用Moment.js:
function dateToLocalISOString(date) {
var offset = date.getTimezoneOffset();
var shifted = new Date(date - offset * 60 * 1000);
return shifted.toISOString().slice(0, -1);
}
最后,您可能会阅读其他人关于将这些内容存储为UTC的建议。不要听。建议&#34;总是使用UTC&#34;目光短浅。许多场景需要当地时间。安排约会是当地时间的主要用例。但是,如果您需要在该约会上行动,您将使用当前的UTC时间,并且您还需要有关约会时区的一些信息,以便您可以转换从UTC到约会的时区。例如,如果这类似于面对面医生的办公室预约,那么可以安全地假设医生办公室的时区。但是,如果它是在线会议的预约,那么您必须单独捕获用户的时区并在适当的后端应用它。
答案 1 :(得分:0)
问题在于您当前的时区。
在这种情况下,您的应用程序所做的是获取当前时区(+3)。
现在它获得了你的时区,但它将转换为utc时间。那么会发生什么,你现在的时间将是-3小时。
如果您不适应夏季和冬季时间,那么您只需在日期时间内添加3小时即可。否则,您必须获取时区的偏移量并将其添加到当前日期时间值。 如果您在不同的时区使用此应用程序,请小心。例如您的生活在+3,其他生活在+2时区。