【问题标题】:AngularJs $http sends date object to server without time offsetAngularJs $http 将日期对象发送到没有时间偏移的服务器
【发布时间】:2018-01-14 10:43:46
【问题描述】:

我有一个 AngularJs 应用,其中一个页面有引导日期时间选择器工具。
这就是使用它的输入的样子:

<input class="form-control"
   is-open="vm.search.openFromYear"
   name="txtfromYear"
   ng-click="vm.search.openFromYear = !vm.search.openFromYear"
   ng-init="vm.search.openFromYear = false"
   ng-model="vm.searchModel.fromYear"
   placeholder="dd/MM/yyyy"
   show-button-bar="false"
   type="text"
   uib-datepicker-popup="dd/MM/yyyy" />

当我选择一个我在输入中正确看到的日期时,假设我选择了14/01/2017..

vm.searchModel.fromYear 中保存为js 日期对象,日期值和时区Sun Jan 14 2018 00:00:00 GMT+0300 (Turkey Standard Time)

问题是当我将它发送到服务器时,它由$http 服务转换并由 ajax 发送,例如:2018-01-13T21:00:00.000Z

如您所见,它落后了一天(因为转换为 UTC 格式,但没有时间偏移 +3 小时。

API 接收此字符串并将其绑定到DateTime 类型的属性,但实际上,日期将是2018-01-13,而不是2018-01-14,因为用户确实选择了它。

知道为什么会这样吗?我阅读了一些答案,但没有找到解释或解决方案。

【问题讨论】:

  • 您的后端没有考虑 UTC。前端没毛病
  • 看看console.log(new Date('2018-01-13T21:00:00.000Z'))显示了什么
  • 在客户端它会正确显示,因为浏览器会考虑时区,但在服务器上它根本不知道偏移量,因为它没有在发送给它的日期字符串值中提及。
  • 是的。 Z 是祖鲁语,这意味着它是格林威治标准时间
  • 对,但是客户端比格林威治标准时间早 +3 小时,我在发送到服务器的字符串中看不到 +3 值,我错过了什么吗?

标签: c# angularjs twitter-bootstrap datetime


【解决方案1】:

$http 转换的 ISO 字符串是正确的。因为你只需要一个解释:

时间是 GMT+3 时区的 00:00,GMT 时区的 21:00。 ISO 字符串表示 GMT 时区时间,比 GMT+3 晚 3 小时,因此是日期

【讨论】:

  • 服务器(正在接收 '2018-01-13T21:00:00.000Z' 值)如何知道偏移量是 +3 还是 +5 或任何其他值?
  • 我建议您在发送到服务器之前将客户端日期转换为服务器的时区。即在客户端的应用程序配置中定义服务器的时区。 momentmoment-timezone 会有所帮助。
猜你喜欢
  • 2014-04-13
  • 2016-05-26
  • 2011-09-15
  • 1970-01-01
  • 2016-04-09
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多