【问题标题】:AngularJS date received at server is one day behind服务器收到的 AngularJS 日期晚了一天
【发布时间】:2017-09-05 03:12:13
【问题描述】:

我在我的项目中使用persian-datepicker,当我通过这个组件选择一个日期时,存储在modelValue 中的值是这样的:Mon Apr 10 2017 00:00:00 GMT+0430 (Iran Daylight Time),但是当我使用$http.post 将此值发送到服务器时,这个值被转换成这个:2017-04-09T19:30:00.000Z 并且服务器端代码把这个值解释为昨天,有人知道在这种情况下我应该怎么做吗?我对这种行为感到很困惑。

【问题讨论】:

  • 您的服务器似乎在GMT 中,因此将您的日期时间转换为它。如果你看时间,正好是4:30less

标签: angularjs datetime timezone angular-ui-bootstrap


【解决方案1】:

我以前没有使用过persian-datepicker,但我在angular-ui-bootstrap datepicker 上遇到了这个问题,我认为这是相关的。 angular-ui-bootstrap datepicker 使用 JavaScript Date 对象来计算日期,因此它会序列化为 UTC 日期时间字符串。

在原生angular-ui-bootstrap datepicker你可以这样做:

ng-model-options="{timezone: 'utc'}"

获取没有时区计算的日期选择器。

根据这个persian-datepicker 问题,似乎也支持ng-model-options。如果是这样,那么您可以尝试:

<input
 uib-datepicker-popup
 ng-model="modelValue"
 ng-model-options="{timezone: 'utc'}">

请参阅此Similar Question 获取想法。

编辑:手动转换日期

如果persian-datepicker不支持上述方法,那么试试这个方法。 将 modelValue 中的日期转换为 日期对象 例如

var date = new Date(modelValue);

那么你可以这样做:

var formattedDate = date.getFullYear() + '-' + (date.getMonth() + 1) +  '-' + date.getDate();

这会给你一个像'2017-4-10'这样的日期,没有任何转换。但是,如果你想使用 UTC 转换,请这样做:

var formattedDate2 = date.getUTCFullYear() + '-' + (date.getUTCMonth() + 1) +  '-' + date.getUTCDate();

在将日期发送到服务器并将formattedDateformattedDate2发送到服务器之前执行此操作。似乎在您调用$http.post之前,以下操作已完成,将您的日期转换为 JSON -

JSON.stringify(date) 

产生 :2017-04-09T19:30:00.000Zthat 又被发送到服务器。

【讨论】:

  • 它认为问题表明不支持时区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2015-12-06
  • 2016-08-19
  • 1970-01-01
  • 2020-04-24
相关资源
最近更新 更多