如何在数据库中节省正确的时间



我有一个称为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中。

几件事:

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

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

  • 在客户端,假设StartDateEndDate是JavaScript Date对象,并且它们是使用本地时间值(即浏览器的时区)创建的,当您调用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时区中的其他生活。

相关内容

  • 没有找到相关文章

最新更新