it-swarm.com.de

winkel $ http.post Datum auf UTC-Datum ändern

Ich habe versucht, einige Daten an meine REST - API zu senden, die das Datum ... hat. Nun ist mein Datumsparameter ein JS Date-Objekt mit dem korrekten Datum in meiner Zeitzone: Tue Apr 04 2017 00:00:00 GMT+0530.

nachdem er meinen Code verlassen hat und ich dasselbe in der Registerkarte "Netzwerk" sehe, wird er in das UTC-Datum konvertiert: "2017-04-03T18:30:00.000Z"

Ich habe nach der Lösung gesucht, nach der ich die Datei für das Gebietsschema von angle in meine index.html aufnehmen muss.

<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script>

aber es hilft nicht. Ich habe Lösungen wie das Hinzufügen von Datumsformaten zum Filtern oder ähnliches gesehen, aber ich möchte eine globale Lösung Irgendwelche Hilfe? Danke :)

20
pranavjindal999

Der Umgang mit Datum, Uhrzeit und Zeitzone hat mich auch verwirrt. Diese Antwort gibt Ihnen vielleicht einen Einblick, wie Sie damit umgehen können.

Versuchen Sie den folgenden Code in der Entwicklerkonsole von Chrome und sehen Sie, wie das gleiche Datum in verschiedenen Formaten dargestellt wird:

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"

Jedes Datum, das Sie auf dem Client erstellen, zeichnet das Datum immer mit einem Zeitversatz von null auf, d. H. UTC+/-00:00 Z. Der Einfachheit halber können Sie UTC und GMT als identisch betrachten. Bei Anzeigezwecken wird das gleiche Datum wie in der Zeitzone des Browsers angezeigt. Wenn Sie console.log (date) ausführen, wird Sat Apr 29 2017 15:24:28 GMT+0530 (IST) ausgegeben. Dies bedeutet jedoch nicht, dass die interne Aufzeichnung des Datums der Zeitzone des Browsers entspricht. Es wird nur auf dem Bildschirm/in der Konsole als Zeitzone des Browsers dargestellt.

Sehen Sie sich Datumsdarstellungen an, die nicht von einer Zeitzone in eine andere konvertiert wurden, sondern betrachten sie als unterschiedliche Darstellung des gleichen Datums. In Ihrem Browser wird es als GMT+0530 offset dargestellt, und wenn es an den Server gesendet wird, ist es dasselbe Datum bei einem Nullpunkt der Zeitzonenverschiebung.

Wenn Sie den 4. April um 00:00 Uhr in der GMT + 0530-Zeitzone wählen, wird der dritte April um 18:30 PM um GMT + 0 sein, d. Lass es zum Server gehen, so wie es ist. Wenn Sie dieses Datum verwenden müssen, wird es als 3. April vom Server zurückgegeben und im Browser als Zeitzonen-Offset des Browsers angezeigt. Es ist keine Konvertierung erforderlich, es handelt sich um ein Datum mit einer anderen Darstellung.

Ich habe einmal eine bezogene Frage gestellt , dies könnte zu mehr Klarheit führen.

Und insgesamt ist diese Antwort immer noch die gleiche wie bei @geminiousgoel und @charlietfl.

12
Ritesh Jagga

Szenario:

Senden Sie das Datum von UI in API call als Epoch time (UNIX-Zeit) anstelle von date-Zeichenfolge. Sie können die Methode getTime () verwenden, um das Datum in eine Epoche umzuwandeln.

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

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

console.log(dateEpoch); // 1491244200000 (Local Time)

Auf der Empfängerseite müssen diese Epoch time (UNIX-Zeit) erneut in Date konvertiert werden. Es wird das gleiche lokale Datum\time angegeben, das von der UI vergangen ist.

Beispielscreenshot enter image description here

3
Rohit Jindal

Wie von charlietfl vorgeschlagen, würde der globale Hack wahrscheinlich die Date.prototype.toJSON () -Methode überschreiben, aber das ist keine gute Praxis. 

Wo verwendest du deinen $ http.post-Anruf? Der beste Ort, um eine $ http-Anfrage einzureichen, wäre in einem Dienst. Wenn Sie einen Dienst verwenden, schlage ich vor, dass Sie Ihre API für öffentliche Dienste einschließen, sodass Sie über "öffentliche" und "private" Methoden verfügen können. Dies können Hilfsprogramme sein, um allgemeine Operationen wie Datentransformationen, Validierungen durchzuführen.

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
    };
});
3
Redd Sanso

ich denke, Sie können es einfach als Zeichenfolge übergeben (wenn die API, die Sie verwenden, Zeichenfolgen akzeptieren), mit dem Format, das Sie benötigen, sagen Sie "Tue Apr 04 2017 00:00:00 GMT + 0530" und speichern Sie es im Backend als Zeichenfolge und Wenn Sie es abrufen, wird es eine Zeichenfolge sein und wird daher in keiner Weise geändert.

3
Ahmad Abo Saa

Das Übergeben des UTC-Datums an den Server ist das gewünschte Verhalten. Die Client-APIs sollen UTC-Zeit verarbeiten, anstatt davon auszugehen, dass es sich bei den Datumsangaben um lokale Daten handelt. 

Sie können das Datum jedoch auf der Grundlage der lokalen Zeitzone in eine Zeichenfolge konvertieren und die Zeichenfolge an den Server übergeben. 

3
Dada

Haben Sie die Bibliothek angle-locale_en-in.js Ihrer App hinzugefügt? Etwas wie das....

angular.module('myAngularApp', [
    'ngLocale'])

Andernfalls hat die js-Bibliothek in Ihrer Winkelanwendung keine Auswirkungen.

2
Gi1ber7

Jindal saab, es wird so funktionieren. Wenn wir ein Datum mit Datumsauswahl auswählen oder einfach einen Wert übergeben, nimmt es das ursprüngliche lokale Datum an, aber wenn wir diesen Wert weiter übergeben, wird es in UTC konvertiert. Danach muss es am Empfangsende erneut in die lokale Zone konvertiert werden. Datenbank speichert Datum und Uhrzeit im UTC-Format.

2
geminiousgoel

Hängen Sie UTC am Ende an, damit der Browser sie in UTC-Datum konvertiert

var dateToServer =new Date(dateFromUser+" UTC"); ist das dateToServer im UTC DateTime-Format.

0
Sharan Rai

Json Serializer-Parsedatum von String. Auf einem Client werden die Datumseigenschaften als lokales Datum in der Browserzeitzone gespeichert. Wenn Sie Ihr Objekt an den Server senden, werden alle Datumseigenschaften in utc-Zeichenfolge konvertiert. In den meisten Fällen ist es ein ordentliches Verhalten. Manchmal müssen Sie jedoch das Datum in einer Serverzeitzone festlegen und senden. Häufig müssen Sie nur das Datum ohne Uhrzeit einstellen. In diesem Fall sollten Sie die String-Eigenschaften definieren und manuell einstellen. Ich wende diesen Trick normalerweise an.

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;
}

Zum besseren Verständnis dieses Themas können Sie dieses Thema lernen.

0
trueboroda