我试图将一些数据发布到我的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>
但它没有帮助。 我已经看到了添加日期格式以过滤或类似的解决方案,但我想要一个全局解决方案。 有帮助吗? 谢谢:))
答案 0 :(得分:13)
处理日期,时间和时区也让我感到困惑。可能这个答案可以帮助您了解如何处理它们。
在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"
您在客户端上创建的任何日期始终将日期记录为零时区偏移,即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 PM GMT + 0,即零时区偏移。让它按原样进入服务器。当您需要使用此日期时,它将在4月3日从服务器返回,并将根据浏览器的时区偏移量显示在浏览器中。没有涉及转换,它是一个具有不同表示的日期。
我曾经问related question,这可能会增加更多的说明。
总的来说,这个答案仍然与@geminiousgoel和@charlietfl答案相同。
答案 1 :(得分:3)
就像charlietfl建议的那样,全局黑客可能会覆盖Date.prototype.toJSON()方法,但这不是一个好习惯。
你在哪里使用$ http.post电话?提交$ http请求的最佳位置是服务。如果你使用的是服务,那么我建议你包装你的公共服务API,这样你就可以拥有&#34; public&#34;和#34;私人&#34;方法:这些可以是执行常见操作的实用程序,例如数据转换,验证..
angular.service('bookStoreService', ['$http'], function($http) {
var normalizeBooks = function(booksArray){
booksArray.forEach(function(book){
// do something on the book
});
};
var updateBooks = function(books){
normalizeBooks(books);
$http.post('myurl', books);
};
return {
updateBooks : updateBooks
};
});
答案 2 :(得分:3)
情景:
将UI
的日期作为API call
(UNIX时间)而不是epoch time
字符串发送到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)
&#13;
在接收方端,他们必须再次将此epoch time
(UNIX时间)转换为Date
。它将提供从UI
传递的相同本地日期\时间{1}}。
答案 3 :(得分:3)
将UTC日期传递给服务器是理想的行为。客户端API应该处理UTC时间,而不是假设日期都是本地日期。
但无论如何,您可以根据本地时区将日期转换为字符串,并将字符串传递给服务器。
答案 4 :(得分:3)
我认为你可以将它作为字符串传递给你(如果使用接受字符串的api),你可以说,&#34; Tue Apr 04 2017 00:00:00 GMT + 0530&#34;并将其作为字符串保存在后端,然后当您检索它时,它将是字符串,因此不会以任何方式更改。
答案 5 :(得分:2)
答案 6 :(得分:2)
您是否已将angular-locale_en-in.js库添加到您的应用中?像这样......
angular.module('myAngularApp', [
'ngLocale'])
否则,js库在角度应用程序中不会产生任何影响。
答案 7 :(得分:0)
在结尾处附加UTC,以便浏览器将其转换为UTC日期
var dateToServer =new Date(dateFromUser+" UTC");
现在 dateToServer 将是UTC DateTime格式。
答案 8 :(得分:0)
Json序列化器从字符串解析日期。在客户端上,日期属性存储为浏览器时区中的本地日期。将对象发布到服务器时,所有日期属性都将转换为utc字符串。在大多数情况下,这是正确的行为。但是有时您需要在服务器时区中设置和发送日期。通常,仅应设置日期失效时间。在这种情况下,您应该定义字符串属性并手动进行设置。我通常会采用这种技巧。
class Obj{
d: Date
}
class ObjDto{
constructor(obj: Obj){
this.d= dateTimeToIsoLocalDateString(obj.d)
}
d: string
}
...
export function DateTimeToDate(date) {
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
}
export function dateTimeToIsoLocalDateString(dateTime: Date): string {
if (dateTime === null) {
return null;
}
let date = DateTimeToDate(dateTime);
let res = date.toISOString().replace("Z", "");
return res;
}
为进一步了解该主题,您可以学习此topic
答案 9 :(得分:0)
//in res data of rest service in x the value is date in y value of y-axis
for (const i in res) {
console.log(i);
const a = {x: new Date(this.mimikatzlog[i].x), y: this.mimikatzlog[i].y};
this.policies.push(a);