服务器收到的AngularJS日期落后

时间:2017-04-10 07:18:38

标签: angularjs datetime timezone angular-ui-bootstrap

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

1 个答案:

答案 0 :(得分:3)

之前我没有使用过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.000Z然后被发送到服务器。