如何在ASP.NET应用程序中调整时区?

时间:2015-02-11 07:37:23

标签: c# asp.net twitter-bootstrap

我们有在+3时区的服务器上托管的ASP.NET应用程序。数据库也位于+3时区。客户可以在其他时区。

应用程序按日期范围搜索某些事件。我们使用2个Bootstrap日期选择器(BeginDate和EndDate)来获取日期。问题是返回选定的BeginDate之前的一些事件,这是不正确的。例如,如果我们在客户端选择BeginDate = 11.02.2015。和EndDate = 11.02.2015。对于某些时区,时间会以这种方式转移:

  1. 客户端位于+3时区:@ BeginDate ='2015-02-11 00:00:00',@ EndDate ='2015-02-11 00:00:00'(由于客户端没有转移和服务器在同一时区)
  2. 客户位于+6时区:@ BeginDate ='2015-02-10 21:00:00',@ EndDate ='2015-02-10 21:00:00'(有3班)小时,因为客户端是与服务器时区相关的+3)
  3. 客户位于+7时区:@ BeginDate ='2015-02-10 20:00:00',@ EndDate ='2015-02-10 20:00:00'(有一个班次为4小时,因为客户端是+4与服务器时区有关)
  4. 客户位于+8时区:@ BeginDate ='2015-02-10 19:00:00',@ EndDate ='2015-02-10 19:00:00'(有一个班次为5小时,因为客户端是与服务器时区相关的+5)
  5. 显然有一些事件发生在前一天10.02.2015。也将被退回。

    如何克服这个问题?

    其他信息:

    似乎问题出在客户端,我们有以下代码:

    $scope.actionDatesQuery = {
        actionId: -1,
        limit: 10,
        toJSON: function () {
            return ($scope.actionsQuery.searchText) ? {
                ActionId: this.actionId,
                FromDate: moment().toJSON(),
                ToDate: moment().add('y', 1).toJSON()
            } : {
                ActionId: this.actionId,
                FromDate: ($scope.actionsQuery.fromDate) ? moment($scope.actionsQuery.fromDate).toJSON() : moment().toJSON(),
                ToDate: ($scope.actionsQuery.toDate) ? moment($scope.actionsQuery.toDate).add('d', 1).toJSON() : moment().add('y', 1).toJSON(),
                IsOpenDatesIncluded: $scope.actionsQuery.isOpenDatesIncluded
            };
        }
    };
    

    选择FromDate和ToDate日期后,我们在服务器端使用它们:

    public IEnumerable<ActionInformation> QueryActionsInformation(ActionsQuery query)
    {
        var sql = query.BuildSql();
        using (var cn = ConcertDb.CreateSqlConnection())
        {
            var searchText = string.Empty;
            if (!string.IsNullOrWhiteSpace(query.SearchText))
                searchText = "%" + DapperUtils.EncodeLikeString(query.SearchText) + "%";
    
            return cn.Query<ActionInformationDTO>(sql, new
            {
                BeginDate = query.FromDate,
                EndDate = query.ToDate,
                query.CounterAgentId,
                SearchText = searchText,
                query.CityId,
                query.ActionPlaceId,
    
                query.ActionTypeIDArray,
                query.MaxPrice,
                query.MinPrice
            }).Select(t => (ActionInformation) t);
        }
    }
    

    正如您所看到的,我们也使用了moment.js库,似乎我应该在客户端更改该部分,但我不确定以哪种方式。

1 个答案:

答案 0 :(得分:0)

您应该进行概念性切换:根本不在您的数据库中存储分区时间,而是使用UTC。这样,它与您的服务器的物理位置无关。

然后,在客户端,您可以使用JavaScript函数Date.getTimezoneOffset()并将其值传递给隐藏字段。回发后,您可以读取服务器端的值并以适当的方式对其作出反应。