一尘不染

如何发送不带时区的AngularStrap datepicker值?

angularjs

我想知道是否有可能使用AngularStrap的datepicker而不保留用户的语言环境的时区信息。在我们的应用程序中,我们要处理具有到期日期的Contract对象。

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

  1. 用户选择日期(例如2013-10-24)
  2. Angular将javascript日期对象绑定到ng-model字段
  3. 绑定的日期对象位于用户的时区(例如GMT + 3)
  4. 用户提交表格
  5. 使用Angular的$ http服务将日期发送到服务器

在步骤5中,日期将转换为UTC格式。所选日期为格林尼治标准时间+3 2013-10-24(午夜),但UTC转换将日期更改为2013-10-23的晚上9点。

我们如何在整个过程中阻止转换或使用UTC日期?我们不希望合同的日期根据用户的本地时区更改。相反,我们希望该日期始终为2013-10-24,无论是哪个时区。

我们当前的解决方案是对AngularStrap库进行少量更改,以使日期在发送到服务器时不会更改。

如果我们可以在服务器中获得用户选择的时区,则可以在那里进行另一次转换,但是服务器没有该信息。

所有想法表示赞赏!


阅读 173

收藏
2020-07-04

共1个答案

一尘不染

问题不是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();

这将为您提供一个看起来像基于UTC的字符串,'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();
2020-07-04