Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 日期时区在我的AngularJS控制器和后端实体框架之间丢失_Asp.net Mvc_Angularjs_Angularjs Directive_Entity Framework 6 - Fatal编程技术网

Asp.net mvc 日期时区在我的AngularJS控制器和后端实体框架之间丢失

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值

我面临一个问题,AngularJS和实体框架之间缺少日期时间分区

这是我的角度代码示例:

我从服务器端(ASP.NET MVC5)获取的日期是这样的字符串:
“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";
  });
}());