我们有在+3时区的服务器上托管的ASP.NET应用程序。数据库也位于+3时区。客户可以在其他时区。
应用程序按日期范围搜索某些事件。我们使用2个Bootstrap日期选择器(BeginDate和EndDate)来获取日期。问题是返回选定的BeginDate之前的一些事件,这是不正确的。例如,如果我们在客户端选择BeginDate = 11.02.2015。和EndDate = 11.02.2015。对于某些时区,时间会以这种方式转移:
显然有一些事件发生在前一天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库,似乎我应该在客户端更改该部分,但我不确定以哪种方式。
答案 0 :(得分:0)
您应该进行概念性切换:根本不在您的数据库中存储分区时间,而是使用UTC。这样,它与您的服务器的物理位置无关。
然后,在客户端,您可以使用JavaScript函数Date.getTimezoneOffset()
并将其值传递给隐藏字段。回发后,您可以读取服务器端的值并以适当的方式对其作出反应。