如何在数据库中保存正确的时间?

时间:2017-09-01 08:05:50

标签: javascript c# angular typescript timezone

我有一个名为appointment的对象,它有两个属性:StartDateEndDate

当我发出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

2 个答案:

答案 0 :(得分:1)

一些事情:

  • 不要在网络应用程序中调用ToUniversalTime。它旨在将服务器的本地时区转换为UTC。服务器的时区应该与您的应用程序无关。 Web应用程序绝不应使用ToUniversalTimeToLocalTimeDateTime.NowTimeZoneInfo.LocalDateTimeKind.Local或任何其他使用计算机时区的方法。正在运行。

  • 理想情况下,在服务器端,您的model.StartDatemodel.EndDate 已成为DateTime个对象,因为他们已经以这种方式反序列化。因此,您可能不需要致电Convert.ToDateTime。如果它们是字符串,那么我会相应地调整您的模型类。

  • 在客户端,假设StartDateEndDate是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时区。