Asp.net mvc 日期时区在我的AngularJS控制器和后端实体框架之间丢失
我面临一个问题,AngularJS和实体框架之间缺少日期时间分区 这是我的角度代码示例: 我从服务器端(ASP.NET MVC5)获取的日期是这样的字符串:Asp.net mvc 日期时区在我的AngularJS控制器和后端实体框架之间丢失,asp.net-mvc,angularjs,angularjs-directive,entity-framework-6,Asp.net Mvc,Angularjs,Angularjs Directive,Entity Framework 6,我面临一个问题,AngularJS和实体框架之间缺少日期时间分区 这是我的角度代码示例: 我从服务器端(ASP.NET MVC5)获取的日期是这样的字符串:“2015-02-17T00:00:00”,没有任何时区信息 要将该字符串解析为date并将其绑定到输入[date],我将使用angularjs指令 我的问题是:我的本地时区是+4,在更改值并将其推回到ngModel后,它将转换为UTC时间,因此日期部分将返回-1天。换言之,如果我在日期输入中选择了2015年2月18日的日期,ngModel值
“2015-02-17T00:00:00”
,没有任何时区信息
要将该字符串解析为date并将其绑定到输入[date],我将使用angularjs指令
我的问题是:我的本地时区是+4,在更改值并将其推回到ngModel后,它将转换为UTC时间,因此日期部分将返回-1天。换言之,如果我在日期输入中选择了2015年2月18日的日期,ngModel值将为:2015-02-17T20:00:00.000Z
。因此,当传回服务器时,我在控制器中接收它,如下所示:
{5/17/1988 8:00:00 PM}
Date: {5/17/1988 12:00:00 AM}
dateData: 5238841010427387904
Day: 17
DayOfWeek: Tuesday
DayOfYear: 138
Hour: 20
InternalKind: 4611686018427387904
InternalTicks: 627154992000000000
Kind: Utc
Millisecond: 0
Minute: 0
Month: 5
Second: 0
Ticks: 627154992000000000
TimeOfDay: {20:00:00}
Year: 1988
此日期的类型为Utc。但是,当我通过实体框架(v6)将其传递给DB时,它被保存,没有任何时间分区。所以,下次我加载它时,它将在本地时区,所以与原始值相差-4小时,这是错误的
实体框架模型中的这个日期属性很简单,就像这个public DateTime BirthDate{get;set;}
一样,在DB(MSSQL)中,它的类型是DateTime,如下所示:[BirthDate]DateTime NOT NULL
我认为解决方案应该是:要么强制Angular只使用本地时区,而我的应用程序只在本地运行,要么强制entity framework保存时区信息
我更喜欢使用第一个选项,但是我通过将angularJS指令的返回类型从Date对象更改为字符串,并使用
yyyy-mm-dd
格式解决了这个问题
之前:
(function() {
function parseDateString(dateString) {
if ('undefined' === typeof dateString || '' === dateString) {
return null;
}
var parts = dateString.split('-');
var year = parseInt(parts[0], 10);
var month = parseInt(parts[1], 10);
var day = parseInt(parts[2], 10);
return new Date(year, (month - 1), day);
}
var mainApp = angular.module('mainApp', [])
.directive('input', ['dateFilter',
function(dateFilter) {
return {
restrict: 'E',
require: '?ngModel',
link: function(scope, element, attrs, ngModel) {
if ('undefined' !== typeof attrs.type && 'date' === attrs.type && ngModel) {
ngModel.$formatters = [ function(modelValue) { return dateFilter(modelValue, 'yyyy-MM-dd'); } ];
ngModel.$parsers = [ function(viewValue) { return parseDateString(viewValue); } ];
}
}
}
}
]).controller("myController", function($scope) {
$scope.testDate = "2015-02-17T00:00:00";
});
}());
之后:
(function() {
var mainApp = angular.module('mainApp', [])
.directive('input', ['dateFilter',
function(dateFilter) {
return {
restrict: 'E',
require: '?ngModel',
link: function(scope, element, attrs, ngModel) {
if ('undefined' !== typeof attrs.type && 'date' === attrs.type && ngModel) {
ngModel.$formatters = [
function(modelValue) {
return dateFilter(modelValue, 'yyyy-MM-dd');
}
];
ngModel.$parsers = [
function(viewValue) {
return dateFilter(modelValue, 'yyyy-MM-dd');
}
];
}
}
}
}
]).controller("myController", function($scope) {
$scope.testDate = "2015-02-17T00:00:00";
});
}());