AngularJS 服务器收到的日期晚了一天

AngularJS date received at server is one day behind

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

我以前没有使用过 persian-datepicker,但我在 angular-ui-bootstrap datepicker 上遇到过这个问题,我认为这是相关的。 angular-ui-bootstrap datepicker 使用 JavaScript 日期 对象来计算日期,因此它序列化为 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' 的日期,没有任何 conversion.However,如果你想使用 UTC 转换,请这样做:

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

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

JSON.stringify(date) 

产生:2017-04-09T19:30:00.000Z然后发送到服务器。