如何在没有时区的情况下发送 AngularStrap 日期选择器值



我想知道是否可以使用 AngularStrap 的日期选择器而不保留用户的区域设置的时区信息。在我们的应用程序中,我们希望处理具有到期日期的合约对象。

添加或编辑合同对象时,有一个日期选取器字段用于选择日期。发生以下情况:

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

普伦克在这里

相关内容

  • 没有找到相关文章

最新更新