如何发送没有时区的AngularStrap datepicker值?
我想知道是否有可能使用AngularStrap的datepicker没有它保持用户的区域设置的时区信息。 在我们的应用程序中,我们想要处理具有到期date的合同对象。
在添加或编辑合同对象时,有一个用于selectdate的dateselect器字段。 以下事情发生:
- 用户selectdate(例如2013-10-24)
- Angular将javascriptdate对象绑定到ng-model字段
- 绑定的date对象位于用户的时区(例如GMT + 3)
- 用户提交表单
- 使用Angular的$ http服务将date发送到服务器
在第5步中,date转换为UTC格式。 选定的date是在午夜十二点三十五分(GMT + 3)2013-10-24,但UTC转换将date更改为2013-10-23在晚上九点。
我们如何防止转换,或在整个过程中使用UTCdate? 我们不希望合约的date根据用户的当地时区而改变。 相反,我们希望date总是在2013-10-24,不pipe什么时区。
我们目前的解决scheme是对AngularStrap库做一些小的修改,这样date在发送到服务器时不会改变。
如果我们可以在服务器中获得用户所选的时区,我们可以在那里进行另一次转换,但服务器没有这些信息。
所有的想法都赞赏!
这个问题不是AngularStrap。 它只是如何JavaScript的date工作,以及如何JSON格式的传输。 将JavaScriptdate对象转换为JSONstring时,它将string格式化为UTC。
例如,我在犹他州,现在是2013年10月24日07:41。 如果我创build一个新的JavaScriptdate并打印到控制台,它会说:
Thu Oct 24 2013 07:41:19 GMT-0600 (MDT)
如果我使用相同的date(使用JSON.stringify(date)
,我得到:
"2013-10-24T13:41:47.656Z"
你可以看到不在我目前的时区,但在UTC。 所以转换发生在表单从JavaScript对象转换为JSONstring之前发送到服务器。
最简单的方法是将date更改为您自己select的string,然后再将date发送到服务器。 因此,不要让JSON将date更改为UTC(假设您不关心一天中的某个时间),只需执行如下操作即可:
var dateStrToSend = $scope.date.getUTCFullYear() + '-' + ($scope.date.getUTCMonth() + 1) + '-' + $scope.date.getUTCDate();
这将给你一个基于UTC的string,看起来像'2013-10-24'
,然后你可以发送到服务器,而不是包括时间信息的JSON格式。 希望有帮助。
更新:正如@Matt Johnson所说,有两种方法可以做到这一点。 你说过: How could we prevent the conversion, or use UTC dates during the whole process?
。 如果你想使用UTC,那么使用我上面的解释。 如果您只想“阻止转换”,则可以使用以下内容:
var dateStrToSend = $scope.date.getFullYear() + '-' + ($scope.date.getMonth() + 1) + '-' + $scope.date.getDate();
有点晚了,但我花了我的下午,有人可能会觉得它有用。
另一种声明式的做法是使用dateType,dateFormat和modelDateFormat属性。 设置这些在configuration或HTML例如
angular.module('app').config(function ($datepickerProvider) { angular.extend($datepickerProvider.defaults, { dateFormat: 'dd-MMMM-yyyy', modelDateFormat: "yyyy-MM-ddTHH:mm:ss", dateType: "string" }); });
DateFormat是date将在dateselect器中显示给用户的格式,而modelDateFormat则是在绑定到模型之前将被转换为的格式。
我也有默认值来自服务器,我需要绑定到页面加载dateselect器。 因此,我不得不更新JSON中服务器序列化date的格式以匹配modelDateFormat。 我正在使用Web API,所以我使用下面的。
var jsonSettings = Formatters.JsonFormatter.SerializerSettings; jsonSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss";
“Angular方式”是使用$ filter服务来格式化datepicker返回的date。
示例(HTML):
{{inpDate | date: 'dd-MM-yyyy'}}
示例(JS):
$scope.processDate = function(dt) { return $filter('date')(dt, 'dd-MM-yyyy'); }
在这里住宿