angular $ http.post将日期更改为UTC日期

pra*_*999 25 javascript timezone internationalization angularjs

我试图将一些数据发布到我的REST api,它有日期.现在,当我调试时,我的日期参数是一个JS Date对象,在我的时区中具有正确的日期:Tue Apr 04 2017 00:00:00 GMT+0530

在它离开我的代码后,我在网络选项卡中看到相同的内容,它将转换为UTC日期: "2017-04-03T18:30:00.000Z"

我搜索了解决方案,我需要在index.html中包含angular的locale文件,我做了:

<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script>
Run Code Online (Sandbox Code Playgroud)

但它没有帮助.我已经看到了添加日期格式来过滤等问题的解决方案,但我想要一个全局解决方案.有帮助吗?谢谢 :)

Rit*_*gga 14

处理日期,时间和时区也让我很困惑.可能这个答案可以帮助您了解如何处理它们.

在Chrome的开发者控制台中尝试以下代码,看看如何以不同的格式显示相同的日期:

var date = new Date();
date.toISOString(); // "2017-04-29T09:54:28.714Z"
date.toGMTString(); //"Sat, 29 Apr 2017 09:54:28 GMT"
date.toLocalString(); //"4/29/2017, 3:24:28 PM"
Run Code Online (Sandbox Code Playgroud)

您在客户端上创建的任何日期始终记录零时区偏移的日期,即UTC+/-00:00 Z.为简单起见,您可能认为UTC和GMT相同.在显示目的时,根据浏览器的时区显示相同的日期.如果你这样做console.log (date)会输出,Sat Apr 29 2017 15:24:28 GMT+0530 (IST)但这并不意味着日期的内部记录是根据浏览器的时区.它只是根据浏览器的时区在屏幕/控制台上显示.

查看日期表示不是从一个时区转换为另一个时区,而是将它们视为同一日期的不同表示.在您的浏览器中,它表示为GMT+0530偏移量,当它发送到服务器时,它是零时区偏移量的相同日期.

根据您的评论,如果您选择4月4日凌晨00:00 GMT + 0530时区,内部将于4月3日下午18:30在格林威治标准时间+ 0,即零时区偏移.让它按原样进入服务器.当您需要使用此日期时,它将在4月3日从服务器返回,并将根据浏览器的时区偏移量显示在浏览器中.没有涉及转换,它是一个具有不同表示的日期.

我曾经问过一个相关的问题,可能会增加更多的澄清.

总的来说,这个答案仍然与@geminiousgoel和@charlietfl答案相同.

  • 将日期发送为 `2017-04-03T18:30:00.000Z` 而不是 `2017-04-04T00:00:00.000+05:30` 可能根本不可取,因为客户端的原始时区信息丢失了。例如,假设后端需要验证输入的时间是客户端时区中的“中午之前”。前一个日期的检查将失败而后一个日期的检查会成功,即使它们代表同一时刻。 (2认同)

Roh*_*dal 5

设想 :

将日期从UIintoAPI call作为epoch time(UNIX 时间)而不是date字符串发送。您可以使用getTime()方法将日期转换为纪元时间。

var dateStr = "Tue Apr 04 2017 00:00:00 GMT+0530";

var dateEpoch = new Date(dateStr).getTime();

console.log(dateEpoch); // 1491244200000 (Local Time)
Run Code Online (Sandbox Code Playgroud)

在接收端,他们必须再次将这个epoch time(UNIX 时间)转换成Date。它将给出从UI.

示例截图 在此处输入图片说明


小智 2

Jindal saab,它会像这样工作。当我们使用日期选择器选择任何日期或仅传递任何值时,它会采用原始​​本地日期,但当我们进一步传递该值时,它会将其转换为 UTC,此后需要在接收端再次转换为本地区域。数据库以 UTC 格式保存日期时间。