0

我们正在尝试解决如何让用户输入带有时区的日期时间并将其保存在我的 SQL 数据库中。我的 SQL 服务器中有一个 datetimeoffset 类型的列。

   $scope.saveItemChanges = function ()
{
    var td = new Date();

    $scope.chosenEditItem.ServiceStatusUpdateDateTimeOffset = td;

    $log.info( td.toString() + "ISO " + td.toISOString()  + "UTC " + td.toUTCString() + "JSON " + td.toJSON());
    mainDataService.saveChanges()
        .then (saveSucceededCloseEdit)
        .fail (displayErrors)
}

在我的数据库中,我没有看到时区。只有第 1007-1009 行通过微风插入,其他行正在测试。
在此处输入图像描述

基本上我希望能够捕获客户端上的日期时间和时区并将其存储在我的数据库中。当有人回去查看记录时,我需要能够确定日期时间的时区。我不确定我在客户端 - >服务器的路径中缺少什么,它阻止时区保存在数据库中。

微风日期信息 http://www.breezejs.com/documentation/date-time

控制台日志记录: 在此处输入图像描述 在此处输入图像描述

数据库记录: 在此处输入图像描述

4

1 回答 1

1

Javascript 将所有日期视为 UTC,但您仍然可以在服务器上更改它。

首先,您需要知道客户端上的时区是什么并将其发送到服务器。您可以通过使用未映射的属性来做到这一点(即不会保存到数据库中):

var UnusualDate = function () {
   this.timezoneOffset = 0;
};
em.metadataStore.registerEntityTypeCtor("UnusualDate", UnusualDate);

var td = new Date();
var uD = em.createEntity("UnusualDate", { creationDate: td });       
uD.setProperty("timezoneOffset", td.getTimezoneOffset()/-60);

然后,在服务器 BeforeSaveEntity 或 BeforeSaveEntities 上,检索时区偏移量并相应地重置日期:

var timezoneOffset = Convert.ToInt32(entityInfo.UnmappedValuesMap["timezoneOffset"]);
UnusualDate uDate = entityInfo.Entity as UnusualDate;
uDate.CreationDate = uDate.CreationDate.ToOffset(new TimeSpan(timezoneOffset, 0, 0));

如果您不熟悉 BeforeSaveEntity 和 BeforeSaveEntities,可以查看http://www.breezejs.com/documentation/efcontextprovider-methods上的文档。

于 2013-08-29T00:02:22.880 回答