我想知道是否可以使用 AngularStrap 的日期选择器而不保留用户的区域设置的时区信息。在我们的应用程序中,我们希望处理具有到期日期的合约对象。
添加或编辑合同对象时,有一个日期选取器字段用于选择日期。发生以下情况:
- 用户选择日期(例如 2013-10-24)
- Angular 将 javascript 日期对象绑定到 ng-model 字段
- 绑定的日期对象位于用户的时区(例如 GMT+3)
- 用户提交表单
- 日期使用Angular的$http服务发送到服务器
在步骤 5 中,日期将转换为 UTC 格式。所选日期是午夜的 GMT+3 2013-10-24,但 UTC 转换将日期更改为 2013-10-23 晚上 9 点。
我们如何防止转换,或在整个过程中使用 UTC 日期?我们不希望合约的日期根据用户的本地时区而更改。相反,我们希望日期始终为 2013-10-24,无论哪个时区。
我们当前的解决方案是对 AngularStrap 库进行小的更改,以便在发送到服务器时日期不会更改。
如果我们可以在服务器中获取用户选择的时区,我们可以在那里进行另一次转换,但服务器没有该信息。
所有的想法都值得赞赏!
问题不在于 AngularStrap。 它只是JavaScript日期的工作原理以及JSON如何格式化它们以进行传输。 当您将 javascript 日期对象转换为 JSON 字符串时,它会将该字符串格式化为 UTC。
例如,我在犹他州,现在是 2013-10-24 的 07:41。 如果我创建一个新的javascript日期并将其打印到控制台,它会说:
Thu Oct 24 2013 07:41:19 GMT-0600 (MDT)
如果我字符串化同一日期(使用 JSON.stringify(date)
,我会得到:
"2013-10-24T13:41:47.656Z"
你可以看到它不是在我当前的时区,而是在UTC中。 因此,当表单从javascript对象转换为JSON字符串时,转换就在发送到服务器之前发生。
最简单的方法是在将日期发送到服务器之前将日期更改为您自己选择的字符串。 因此,与其让 JSON 将日期更改为 UTC(假设您不关心一天中的时间),不如执行以下操作:
var dateStrToSend = $scope.date.getUTCFullYear() + '-' + ($scope.date.getUTCMonth() + 1) + '-' + $scope.date.getUTCDate();
这将为您提供一个看起来像'2013-10-24'
的基于 UTC 的字符串,然后您可以将其发送到服务器,而不是包含时间信息的 JSON 格式。 希望这有所帮助。
更新:正如@Matt约翰逊所说,有两种方法可以做到这一点。 你说: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 属性。在配置或 HTML 中设置这些,例如
angular.module('app').config(function ($datepickerProvider) {
angular.extend($datepickerProvider.defaults, {
dateFormat: 'dd-MMMM-yyyy',
modelDateFormat: "yyyy-MM-ddTHH:mm:ss",
dateType: "string"
});
});
日期格式是日期将在日期选取器中向用户显示的格式,而 modelDateFormat 是在绑定到模型之前将转换为的格式。
我也有来自服务器的默认值,我需要在页面加载时将其绑定到日期选择器。因此,我不得不更新服务器在 JSON 中序列化日期的格式以匹配模型日期格式。我正在使用Web API,所以我使用了以下内容。
var jsonSettings = Formatters.JsonFormatter.SerializerSettings;
jsonSettings.DateFormatString = "yyyy-MM-ddTHH:mm:ss";
"Angular 方式"是使用 $filter 服务来格式化日期选择器返回的日期。
示例 (HTML):
{{inpDate | date: 'dd-MM-yyyy'}}
示例 (JS):
$scope.processDate = function(dt) {
return $filter('date')(dt, 'dd-MM-yyyy');
}
普伦克在这里