2016-07-14 33 views
1

Mein Dienst gibt das als Datum 7/14/2016 2:40 AM +00:00 zurück. Wie kann ich das in UTC in JS konvertieren?String-to-Date-Konvertierung in JavaScript

Versucht:

new Date("7/14/2016 2:40 AM +00:00").toISOString(); 

In Datenbank hat das Datum, um UTC gespeichert worden, wenn ich das Datum angezeigt werde ich als Ortszeit angezeigt werden soll.

+0

'+00: 00 'Ist es nicht schon in UTC? –

+1

Sie überdenken das ... –

+0

Ja, es ist in UTC, aber dieses Datum soll in Lokal konvertiert werden. Wenn diese Zeichenfolge übergeben wird, wird der Fehler ausgegeben. Invalid Date – aswininayak

Antwort

0

Angenommen, Sie dieses Format für alle Termine garantieren kann, wird der folgende Code genügen:

const datetime = '7/14/2016 2:40 PM +00:00'; // this is what your service returns 
const pieces = datetime.split(/[/: ]/); 

if (pieces[3] == 12) pieces[3] = 0; // fixes edge case for 12 AM/PM 

const hours = pieces[5] === 'PM' ? Number(pieces[3]) + 12 : pieces[3]; 
const d = new Date(Date.UTC(pieces[2], pieces[0] - 1, pieces[1], hours, pieces[4])); 

console.log(datetime); // prints "7/14/2016 2:40 PM +00:00" 
console.log(d); // prints Date 2016-07-14T14:40:00.000Z 

EDIT: Es gibt ein paar Grenzfälle mit nicht korrekt behandelt, nämlich 00.00/PM, etc., aber diejenigen, kann leicht auch herum bearbeitet werden.

EDIT2: Für diesen Randfall berücksichtigt.

EDIT3: Wie ein Kommentar angegeben, wird dies nur für UTC-Zeiten funktionieren. Wenn die empfangene Zeichenfolge einen Offset aufweisen kann, funktioniert dies nicht.

+0

Dies berücksichtigt keinen anderen Offset als '+00: 00'. –

+0

12 am/pm ist kaum ein "Rand" Fall. In einer gleichmäßig verteilten Stichprobe wird es etwa 8% der Zeit auftreten. – RobG

+0

Wenn Sie wirklich über meine Definition von Rand Fall streiten wollen, gehen Sie für ihn (: Ich habe bereits die Antwort bearbeitet, um es zu erklären, so ist es ein bisschen strittig zu diesem Zeitpunkt ... – michael

1

Es gibt viele Möglichkeiten, eine Zeichenfolge zu analysieren, um ein Date Objekt zu erzeugen.

  • Ein Weg ist, mit dem Date Objekt selbst, sei es durch eine Zeichenfolge an den Konstruktor, oder durch Date.parse verwenden. In der ECMAScript-Spezifikation sind jedoch nur die ISO8601-Formate erforderlich. Jede andere Eingabe ist implementierungsspezifisch und wird möglicherweise von den verschiedenen JavaScript-Laufzeiten erkannt. Insbesondere bei Webbrowsern gibt es viele Unterschiede in den unterstützten Browserformaten.

    Darüber hinaus spielt das Gebietsschema der Umgebung eine Rolle dabei, wie die Werte analysiert werden. Wie sollte 1/2/2016 geparst werden? 2. Januar oder 1. Februar? Sie haben ein Beispiel für 7/14/2016 gezeigt, das eine ungültige Eingabe wäre, wenn es in Großbritannien (z. B.) ausgeführt wird und das Datumsformat DD/MM/YYYY lautet.

  • Sie können benutzerdefinierten Code schreiben, um die Zeichenfolge in ihre Teile aufzuteilen, jedes Teil einzeln zu analysieren und ein Ergebnis zu erstellen. Das Hauptproblem bei diesem Ansatz besteht darin, dass der Code tendenziell starr und manchmal fragil ist. Es sollte gut getestet werden und viele Randfälle müssen berücksichtigt werden.

  • Sie können eine Bibliothek verwenden, die mit Abstand der einfachste und flexibelste Ansatz (IMHO) ist. Mit einer guten Bibliothek kannst du Trost in den gemeinsamen Erfahrungen anderer nehmen und in den Unit-Tests, die (hoffentlich) Teil der von dir gewählten Bibliothek sind. Natürlich bringt die Verwendung einer Bibliothek einige Kompromisse mit sich, einschließlich einer erhöhten Dateigröße und einem gewissen Maß an Kontrolle. Sie sollten diese Kompromisse sorgfältig bewerten.

    Es gibt viele Datumbibliotheken für JavaScript. Am populärsten ist wahrscheinlich moment.js, obwohl es andere zur Auswahl gibt, und einige größere Frameworks haben manchmal ähnliche Funktionen bereits enthalten. Hier

    ist ein Beispiel moment.js mit:

    var i = "7/14/2016 2:40 AM +00:00"; 
    var f = "M/D/YYYY h:mm A Z"; 
    var m = moment(i, f); 
    var o = m.format(f); // will be in the local time, in the same format as the input 
    var d = m.toDate(); // if you really want a Date object 
    
0
var str = "7\/15\/2016 1:00 AM +00:00".replace("+00:00","UTC"); 
console.log(new Date(str).toISOString()); // 2016-07-15T01:00:00.000Z