Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在数据库中节省正确的时间?_Javascript_C#_Angular_Typescript_Timezone - Fatal编程技术网

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应用程序中调用
    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,因为它目前正在观测东欧夏季时间。当夏季结束()时,它将返回UTC+2。因此,不能简单地向所有值添加三个小时

  • 如果要从客户端发送本地时间值,应以ISO 8601格式发送,不带任何
    Z
    或偏移量,例如
    2017-09-01T11:00
    。有几种方法可以实现这一点:

    • 最好的方法是不要将它们放在
      Date
      对象中。例如,如果您的输入使用
      输入类型,
      .value
      属性不是
      日期
      对象,而是ISO 8601格式的
      字符串

    • 如果无法避免使用
      Date
      对象,请创建一个本地ISO字符串,如下所示:

      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转换为约会的时区。例如,如果这类似于医生的办公室预约,那么可以安全地假设医生办公室的时区。但是,如果是在线会议的预约,那么您必须单独捕获用户的时区,并在适当的情况下在后端应用它


还有什么其他价值观?你能添加一个具体的例子吗?Angular中的值是什么,你发送的JSON中的值是什么,数据库中实际存储的值是什么?@Alexandru IonutMihai我想我在客户端也遇到了类似的问题,问题来自数据库服务器的日期时间集。我们总是将datetime+2小时保存下来,因为我们的时间与设置为服务器的时间之间存在差距。@GünterZöchbauer,现在请看一看。很抱歉,但对于我来说,从您的代码中还不清楚在什么时间应用程序的哪个部分的值到底是什么。是角度的第一个值,是C#的值吗?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")