2016-04-20 10 views
1

Ich versuche festzustellen, ob eine Zeichenfolge eine Zahl oder ein Datum ist.Ermitteln, ob die Zeichenfolge Datum oder Nummer ist

Hier ist mein Code:

this._getFieldFormat = (value) => { 

    // check if is date 
    let d = new Date(value); 

    if (!isNaN(d.getTime())) { 
    return 'date'; 
    } 

    // check if is boolean 
    // isNaN(false) = false, false is a number (0), true is a number (1) 
    if(typeof value === 'boolean'){ 
    return 'boolean'; 
    } 

    // check if a string is a number 
    if(!isNaN(value)){ 
    return 'number'; 
    } 

    return typeof value; 
}; 

Es funktioniert nach einem Datum wie: 2016-04-19T23:09:10.208092Z. Das Problem ist, dass 1 ein gültiges Datum (Wed Dec 31 1969 16:00:00 GMT-0800 (PST)) und isNaN(new Date()) ist false (ein Datum ist eine Zahl) aussehen.

Irgendeine Idee, wie man aus dieser Schleife herauskommt?

+0

Test irgendein Datumsformat oder ein bestimmtes? –

+0

Jeder wäre besser, aber wenn ich wählen muss, ist das Zeitformat: '2016-04-19T23: 09: 10.208092Z' – teone

+1

Gibt es einen bestimmten Grund, warum diese Unterscheidung gemacht werden muss? Was ist mit "Daten" wie 2016 - sind diese gültigen Daten? – mc10

Antwort

1

Also, was passiert, heißt Zwang. Da Javascript dynamische Eingabe ist, wenn Sie es zwei verschiedene Typen geben, versucht die js-Engine, einen der Typen in etwas Vernünftiges zu zwingen, oder was es dachte, dass Sie gemeint haben.

Zum Beispiel:

isNan("37"); is false because "37" is converted to the number 37 

isNaN (new Date()) ist false zurück (ein Datum ist eine Zahl)

Es konvertiert Datum zu einer Reihe so dass diese korrekt ist.

jedoch ungültige Werte in Datumszeichenfolgen nicht als ISO-Format erkannt, wie durch ECMA-262 definiert ist, kann oder nicht in NaN, je nach Browser führen und Werte bereitgestellt

So

new Date('23/25/2014'); // NON-ISO string with invalid date values 

Damit wird NaN in allen Browsern zurückgegeben, die ES5 und höher erfüllen.

Auch ein strenger überprüfen können Sie verwenden, um zu tun:

Number.isNan(new Date()); // This should return true 

So rekapitulieren das Datum der ISO-Norm entsprechen, stellen Sie sicher, oder es wird NaN und die strengere Kontrolle benutzen. Hoffe das hilft.

+0

Beachten Sie, dass die Frage, ob 'new Date ('23/25/2014 ')' ein ungültiges Datum erzeugt oder nicht, vollständig von der Implementierung abhängig ist (in Chrome ungültig, 2015-11-25 in IE). – RobG

+0

Meinst du Browser abhängig? – sebenalern

+0

Beim Umgang mit Daten ist es klug, Bibliotheken wie moment.js zu verwenden. Datumsformate können sich von OS/Browser/Programmiersprachen ändern. PHP analysiert Datumsangaben anders als MySQL und Javascript mit - oder/kann ebenfalls Probleme verursachen. Mit MomentJS können Sie etwas wie Moment (myDate, 'MM/DD/YYYY'). toDate() tun und den ISO-Zeitstempel erhalten, solange Sie das erwartete Format eingeben. –

0

Im Allgemeinen und von einem Javascript Design Sicht, jedoch glaube ich nicht, dass Sie es durch Design tun können. Eine beliebige Zahl zwischen 8640000000000000 und dem frühesten Datum in Form einer Zahl von -8640000000000000 kann in Datum konvertiert werden (als Zeit in Millisekunden vom 01. Januar 1970, UTC).

Daher kann eine beliebige Zahl nicht fallen, dieser Bereich kann kein Datum sein. Und jede Zahl, die in den Bereich fällt, wäre ein gültiges Datum oder eine Zahl, und Sie müssen den Kontext verwenden, um zu bestimmen, ob Sie ihn als Zahl oder als Datum interpretieren möchten.

Sie könnten jedoch eine naive Implementierung durchführen, um zu testen, ob die Nummer ein gültiges Datum ist oder nicht, aber das ist das Beste, was Sie tun können, ohne Kontext.

Bestimmen, ob ein Datum eine Zahl ist oder nicht, kann ein bisschen einfacher sein. Weil eine von Menschen lesbare Darstellung des Datums true von isNaN() zurückgibt und dadurch bestimmt, dass es definitiv keine Nummer ist. Dann würden Sie fortfahren und prüfen, ob diese Zeichenfolge ein Datum ist oder nicht, das Sie bereits in Ihrer Funktion getan haben.

Verwandte Themen