Angular JS - 提交到 $http 后日期发生变化 - 时区问题

16

我遇到了一个奇怪的问题,当使用 $http.put 将 Date 传递给 API 时,日期会发生改变,我怀疑是时区问题:

日期选择器触发 ng-change 事件 - 控制台输出:

Tue Jun 10 2014 00:00:00 GMT+0100 (GMT Summer Time)

使用 Angular 的 $http.put 传递给 API ...

当它到达 Fiddler 时:

StartDate=2014-06-09T23:00:00.000Z

正如您所见,日期从6月10日变成了6月9日。

我该如何阻止这种日期变更?是时区导致的变化吗?API 和客户端都在 Localhost 上运行。

此外:

当第二次单击字段并启动日期选择器 / 选择日期时,这个问题不会再次出现:

控制台输出:

Wed Aug 06 2014 22:00:00 GMT+0100 (GMT Summer Time)

Fiddler 接收到的数据:

StartDate=2014-08-06T21:00:00.000Z


我正在将一个格式正确的日期字符串传递给$http。 返回$http.post('api/posts/schedule', data); 日期字符串的正确格式在这里...data.date 2016-04-22 15:15:00 GMT +0100 (BST) 在Chrome中,在网络检查中,我看到发布的日期被转换为:2016-04-22T14:15:00.000Z - 正如您所看到的,http已经为我们处理了时区,但是在这个阶段,这真的是不需要的。如果您稍后提取此存储的值,则无法确定此值是否在BST中创建,并且无法进行反向计算。 输入正确的格式,但输出已更改 :( - landed
1个回答

12

我认为这是一个时区问题,因为你的GMT+0100StartDate=2014-06-09T23:00:00.000Z之间的差异为5小时

.

问题:

你的本地时间当前为BST(英国夏令时),相当于GMT+1

这将是你进行API调用时的默认时间。

然而,该API是由Google在加利福尼亚编写的,他们相当自恋。因此,他们会自动转换时间,因为你没有提供任何日期格式化"指令"。

换句话说,当你打印到console.log()时,Chrome会很好地为你转换,但当你进行$http.put时,Angular会使用其默认TZ(即PST)进行调用,而没有明确的格式化方式。

.

解决方案

你需要强制将日期格式化为你的语言环境。

  • Angular模板

{{ date_expression | date : 'yyyy-MM-dd HH:mm:ss'}}
  • 在JavaScript中

    $filter('date')(date, 'yyyy-MM-dd HH:mm:ss')
    
  • 使用本地化

    <html>
      <head>
        <title>My Angular page</title>
        <script src="angular-locale_en-uk.js"></script>
        ...
      </head>
      <body>
        ...
      </body>
    </html>
    

  • 1
    嗯...使用日期过滤器或日期模板 https://docs.angularjs.org/api/ng/filter/date - Flak DiNenno
    2
    我认为你也可以在<head><script src="angular-locale_en-uk.js"></script>中使用一个本地化文件脚本... - Flak DiNenno
    2
    非常感谢,这似乎有效:StartDate = $filter('date')(StartDate, 'medium'); - Holland Risley
    1
    我正在尝试开发一个可以在全球范围内运行的应用程序,因此我认为需要进行更多的测试,但是我认为简化日期似乎是有效的。谢谢 :) - Holland Risley
    1
    我和OP有完全相同的问题,但我已经在使用过滤器并尝试添加时区参数...所以简而言之,我的日期看起来正确,并且格式化为BST,但http会剥离时区并进行小时计算...但不是按照加利福尼亚时间...我不同意Angular提供了日期格式化指令:Wed Aug 06 2014 22:00:00 GMT+0100(GMT夏令时)如果我得到一个可行的解决方案,我会在这里展示。我没有使用angular-locale文件,所以下一步将尝试使用该文件,但我认为这不是问题,因为我查看了其内容。 - landed
    显示剩余2条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接