如何发送没有时区的AngularStrap datepicker值?

我想知道是否有可能使用AngularStrap的datepicker没有它保持用户的区域设置的时区信息。 在我们的应用程序中,我们想要处理具有到期date的合同对象。

在添加或编辑合同对象时,有一个用于selectdate的dateselect器字段。 以下事情发生:

  1. 用户selectdate(例如2013-10-24)
  2. Angular将javascriptdate对象绑定到ng-model字段
  3. 绑定的date对象位于用户的时区(例如GMT + 3)
  4. 用户提交表单
  5. 使用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'); } 

在这里住宿