我們有+3時區服務器上託管的ASP.NET應用程序。數據庫也位於+3時區。客戶可以在其他時區。如何在ASP.NET應用程序中調整時區?
應用程序按日期範圍搜索某些事件。我們使用2個Bootstrap日期選取器(BeginDate和EndDate)來選取日期。問題是在選定的BeginDate被返回之前的一些事件,這是不正確的。例如,如果我們在客戶端選擇BeginDate = 11.02.2015。和EndDate = 11.02.2015。對於某些時區,時間以這種方式移動:
- 客戶端在+3時區:@ BeginDate ='2015-02-11 00:00:00',@ EndDate ='2015-02 -11 00:00:00'(因爲客戶端和服務器處於同一時區,所以沒有移位)
- 客戶端在+6時區:@ BeginDate ='2015-02-10 21:00:00 ',@ EndDate ='2015-02-10 21:00:00'(由於客戶端服務器時區爲+3,所以有3小時的班次)
- 客戶端在+7時區:@ BeginDate ='2015-02-10 20:00:00',@ EndDate ='2015-02-10 20:00:00'(因爲客戶端的服務器時區爲+4,所以有4小時的轉換)
- 客戶端在+8時區:@ BeginDate ='2015-02-10 19:00:00',@ EndDate ='2015-02-10 19:00:00'(有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庫,並且似乎我應該在客戶端更改該部分,但我不確定以哪種方式。
你知道客戶的*實際時區*嗎?這不僅僅是一個單一的UTC抵消 - 它可以在一年中有所不同,如果他們在一個觀察DST的區域。有多種方式通過Javascript檢測時區。另外,數據如何存儲?如果每個事件都發生在單個時區中,則可能需要存儲事件的* local *時間(以及指示時區的事件)。如果沒有,我建議將它們存儲在UTC中 - 嘗試擺脫對服務器或數據庫時區的任何*依賴關係。 – 2015-02-11 07:39:44
(並請提供一些關於這些事件的更多信息。) – 2015-02-11 07:41:37
通常,您只應在serv/DB端處理UTC。所以客戶應該發送/接收UTC日期並顯示其本地日期時間,這很容易用Javascript完成。只要你嚴格遵守,就不應該有任何問題。你必須確保你的控制器不會嘗試再次轉換接收到的日期*(看看DateTime.Kind),這是我在類似項目中注意到的令人討厭的行爲。 – Robert 2015-02-11 07:50:50