Javascript 如何在数据库中节省正确的时间?
我有一个名为Javascript 如何在数据库中节省正确的时间?,javascript,c#,angular,typescript,timezone,Javascript,C#,Angular,Typescript,Timezone,我有一个名为appointment的对象,它有两个属性:StartDate和EndDate 当我发出POST请求时,我使用ISOString时间发送这些值 this.appointment.StartDate.toISOString() 在服务器端,我收到了这些具有正确值的属性。另外,当我创建模型以便将约会保存到数据库时,它似乎是正确的。我使用了.ToUniversalTime()方法 var newAppointment = new Appointment() { Start
appointment
的对象,它有两个属性:StartDate
和EndDate
当我发出POST
请求时,我使用ISOString
时间发送这些值
this.appointment.StartDate.toISOString()
在服务器端,我收到了这些具有正确值的属性。另外,当我创建模型
以便将约会
保存到数据库时,它似乎是正确的。我使用了.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
服务器和数据库位于
西欧
问题在于您当前的时区
在本例中,应用程序所做的是获取当前时区(+3)
现在它有了您的时区,但它将转换为utc时间。那么会发生什么,你现在的时间是-3小时
如果你不能适应夏天和冬天的时间,那么你可以简单地在datetime上加上3个小时。否则,您必须获取时区的偏移量,并将其添加到当前日期时间值中。
如果您在不同的时区使用此应用程序,请务必小心。例如您生活在+3时区,其他一些人生活在+2时区。以下几点:
- 不要在web应用程序中调用
。它旨在将服务器的本地时区转换为UTC。服务器的时区应该与应用程序无关。Web应用程序不应使用ToUniversalTime
、ToUniversalTime
、ToLocalTime
、DateTime.Now
、TimeZoneInfo.Local
或使用其运行的计算机时区的任何其他方法DateTimeKind.Local
- 理想情况下,在服务器端,您的
和model.StartDate
应该已经是model.EndDate
对象,因为它们已经被反序列化了。因此,您可能不需要调用DateTime
。如果它们是字符串,那么我会相应地调整您的模型类Convert.ToDateTime
- 在客户端,假设
和StartDate
是JavaScriptEndDate
对象,当调用Date
时,它们是使用本地时间值(即浏览器的时区)创建的,您不仅可以获得ISO 8601格式的字符串,还可以将其从浏览器的时区转换为UTCtoISOString
- 在您的示例中,UTC时间比所示日期和时间的UTC时间提前3小时。从您的个人资料中,我看到您位于罗马尼亚,该日期确实是UTC+3,因为它目前正在观测东欧夏季时间。当夏季结束()时,它将返回UTC+2。因此,不能简单地向所有值添加三个小时
- 如果要从客户端发送本地时间值,应以ISO 8601格式发送,不带任何
或偏移量,例如Z
。有几种方法可以实现这一点:2017-09-01T11:00
- 最好的方法是不要将它们放在
对象中。例如,如果您的输入使用Date
输入类型,
属性不是.value
对象,而是ISO 8601格式的日期
字符串
- 如果无法避免使用
对象,请创建一个本地ISO字符串,如下所示:Date
或者,使用:function dateToLocalISOString(date) { var offset = date.getTimezoneOffset(); var shifted = new Date(date - offset * 60 * 1000); return shifted.toISOString().slice(0, -1); }
- 最好的方法是不要将它们放在
- 最后,您可能会阅读其他人关于将这些存储为UTC的建议。别听。“始终使用UTC”的建议是短视的。许多情况需要当地时间。安排约会是本地时间的主要用例。但是,如果您需要执行该约会,您将使用当前UTC时间,并且您还需要一些关于约会时区的信息,以便您可以从UTC转换为约会的时区。例如,如果这类似于医生的办公室预约,那么可以安全地假设医生办公室的时区。但是,如果是在线会议的预约,那么您必须单独捕获用户的时区,并在适当的情况下在后端应用它
Z
。@GünterZöchbauer,在c#
中,我收到了与angular
相同的值。我如何调整到本地时间?当我从数据库中获取数据时,它需要调整?您只需在发布数据时进行调整。数据库将只提供一个没有时区的日期时间(取决于您的设置)<代码>让数=力矩(事件).utcOffset()让datetimezone=moment(event.utc().add(number,'minutes')代码>
moment(yourDateObject).format("YYYY-MM-DD[T]HH:mm:ss.SSS")