2017-11-15 5 views
0

So haben wir mehrere Clients, die sich in mehreren Zeitzonen befinden. Ich ziehe einige Daten von einer API, und die Daten/Zeiten, die in dieser Zeichenfolge sind, sind genau das, was ich anzeigen muss. Ich habe das recherchiert und eine Zeit lang gegraben und habe immer noch keine klare Antwort gefunden. Die Zeichenfolge in kommt formatiert als solche:Zeit aus JS-Datum extrahieren Objekt ohne die Zeitzone zu versetzen

"2017-12-29T20:00:00" 

Was ich will sowohl das Datum und die Uhrzeit können wie zu extrahieren ist, in zwei Strings (keine Zeitzone ausgeglichen, unabhängig davon, wo der Betrachter befindet), aber bin einige Probleme dabei haben. Ich hoffe auch, es in der richtigen Weise zu formatieren. Beispiel:

"M/d/yyyy" 
"hh:mm AM/PM" (12 hour) 

Ich habe zahlreiche Möglichkeiten versucht, dies zu bekämpfen, und nicht wirklich will, nur Teil packen, aber ich bin fast geneigt, dies zu tun. Jede Hilfe wird geschätzt.

+0

Haben Sie in Betracht gezogen, momentjs zu verwenden? moment.format() würde dies zu einer einfachen Aufgabe machen. Sonst würde ich lieber Teilstrings greifen, als es mit den eingebauten JavaScript-Funktionen getHour, getMinute usw. zu bauen. – cstricklan

+0

@cstricklan - Wenn ich das in moment.format() gesetzt hätte, würde es automatisch Zeitzonen ausgleichen? Oder würde es die Uhrzeit/das Datum beibehalten, das in der Zeichenfolge angegeben wurde? – dlimes

+0

Der String '" 2017-12-29T20: 00: 00 "' enthält keine Zeitzoneninformationen. Ja, das Aufrufen von 'moment (" 2017-12-29T20: 00: 00 ")' erstellt das Momentobjekt für 20:00 Uhr in Ihrer lokalen Zeitzone, aber das ist auch die Zone, die von der Funktion format() zum Erstellen der Zeichenfolge verwendet wird es würde 10:00 Uhr bleiben. – cstricklan

Antwort

0

Betrachten Neuformatierung nur die Zeichenfolge, es alle Probleme mit den eingebauten Parser und Zeitzonen vermeidet:

function reformatTimestamp(s) { 
 
    function z(n){return (n<10?'0':'')+ +n} 
 
    var b = s.split(/\D/); 
 
    var h = b[3]%12 || 12; 
 
    var ap = b[3] < 12? 'AM':'PM'; 
 
    return b[1] + '/' + b[2] + '/' + b[0] + 
 
     ' ' + z(h) + ':' + z(b[4]) + ' ' + ap; 
 
} 
 

 
console.log(reformatTimestamp('2017-12-29T20:00:00')) // 12/29/2017 08:00 PM

Ich denke, es wäre besser, den Monat und den Tag mit einer führenden Null zu füllen (aber ich würde auch ein eindeutiges Datumsformat wie DD-MMM-YYYY anstelle der eigenartigen m/d/y verwenden).

0

Mit diesem Code:

function formatAMPM(date) { 
 
    var hours = date.getUTCHours(); 
 
    var minutes = date.getUTCMinutes(); 
 
    var ampm = hours >= 12 ? 'PM' : 'AM'; 
 
    hours = hours % 12; 
 
    hours = hours ? hours : 12; // the hour '0' should be '12' 
 
    minutes = minutes < 10 ? '0'+minutes : minutes; 
 
    var strTime = hours + ':' + minutes + ' ' + ampm; 
 
    return strTime; 
 
} 
 

 
var str = "2017-12-29T20:00:00"; 
 
var dt = new Date(str + "Z"); 
 
console.log("M/d/yyyy"); 
 
console.log((dt.getUTCMonth() + 1) + '/' + dt.getUTCDate() + '/' + dt.getUTCFullYear()); 
 
console.log("hh:mm AM/PM"); 
 
console.log(formatAMPM(dt));

+0

@RobG ja du hast Recht. Ich habe die Zeile options1 entsprechend gelöscht :) –

Verwandte Themen