AngularJs $http发送日期对象至服务器丢失时区偏移问题排查
问题原因及解决方案
这个问题本质上是时区差异导致的日期序列化与解析不匹配问题,咱们一步步拆解来看:
问题根源
- JS Date对象的特性:JavaScript的
Date对象本质上存储的是UTC时间戳,你看到的Sun Jan 14 2018 00:00:00 GMT+0300 (Turkey Standard Time)只是本地时区(土耳其)的展示形式。实际对应的UTC时间是2018-01-13T21:00:00.000Z——因为土耳其时区比UTC早3小时,本地时间0点往前推3小时就是前一天的21点UTC时间。 - AngularJS $http的默认序列化:当你通过
$http发送请求时,Angular会自动把Date对象序列化为ISO 8601格式的字符串,而这个格式默认使用UTC时间(末尾带Z标记),所以就出现了你看到的2018-01-13T21:00:00.000Z。 - 服务器端的解析逻辑:你的API将这个UTC字符串绑定到
DateTime类型时,如果没有正确识别UTC标记,就会把这个时间直接当作服务器本地时间(或者未做时区转换),最终得到的日期就是2018-01-13,而非用户选择的土耳其时区的2018-01-14。
解决方案
你可以从前端或后端入手解决这个问题,根据你的业务场景选择合适的方式:
前端处理方案
方案1:直接发送本地日期字符串
不需要传递Date对象,而是把日期转换成yyyy-MM-dd格式的字符串再发送。可以用Angular的date过滤器实现:// 在发送请求前转换日期 vm.searchModel.fromYearStr = $filter('date')(vm.searchModel.fromYear, 'yyyy-MM-dd'); // 发送时传递fromYearStr而非fromYear这样服务器收到的就是
2018-01-14,直接绑定到DateTime属性就能得到正确日期。方案2:自定义$http的序列化逻辑
全局配置$http的请求转换器,让它把Date对象转换成带本地时区的格式,或者直接转成日期字符串:angular.module('yourApp').config(function($httpProvider, $filterProvider) { $httpProvider.defaults.transformRequest.push(function(data) { if (angular.isObject(data)) { angular.forEach(data, function(value, key) { if (value instanceof Date) { // 转换为本地日期的ISO格式,或者直接用yyyy-MM-dd data[key] = $filter('date')(value, 'yyyy-MM-dd'); } }); } return angular.toJson(data); }); });
后端处理方案
如果更倾向于后端统一处理时区问题:
使用DateTimeOffset类型接收
如果是.NET后端,把接收的属性类型从DateTime改成DateTimeOffset,它会自动保留UTC时区信息,之后你可以根据需要转换为土耳其时区的时间:public DateTimeOffset FromYear { get; set; } // 转换为土耳其时区 var turkeyTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Turkey Standard Time"); DateTime turkeyDate = TimeZoneInfo.ConvertTime(FromYear, turkeyTimeZone);显式解析UTC时间并转换
如果必须用DateTime类型,解析时明确指定是UTC时间,再转换到目标时区:DateTime utcDate = DateTime.ParseExact("2018-01-13T21:00:00.000Z", "yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); var turkeyTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Turkey Standard Time"); DateTime turkeyDate = TimeZoneInfo.ConvertTimeFromUtc(utcDate, turkeyTimeZone);
内容的提问来源于stack exchange,提问作者Dabbas
相关产品推荐
相关产品推荐

