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

时间:2017-04-19 13:17:36

标签: javascript angularjs internationalization timezone

我试图将一些数据发布到我的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>

但它没有帮助。 我已经看到了添加日期格式以过滤或类似的解决方案,但我想要一个全局解决方案。 有帮助吗? 谢谢:))

10 个答案:

答案 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()方法将日期转换为纪元时间。

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

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

console.log(dateEpoch); // 1491244200000 (Local Time)
&#13;
&#13;
&#13;

在接收方端,他们必须再次将此epoch time(UNIX时间)转换为Date。它将提供从UI传递的相同本地日期\时间{1}}。

示例截图 enter image description here

答案 3 :(得分:3)

将UTC日期传递给服务器是理想的行为。客户端API应该处理UTC时间,而不是假设日期都是本地日期。

但无论如何,您可以根据本地时区将日期转换为字符串,并将字符串传递给服务器。

答案 4 :(得分:3)

我认为你可以将它作为字符串传递给你(如果使用接受字符串的api),你可以说,&#34; Tue Apr 04 2017 00:00:00 GMT + 0530&#34;并将其作为字符串保存在后端,然后当您检索它时,它将是字符串,因此不会以任何方式更改。

答案 5 :(得分:2)

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

答案 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);