2009-06-29 18 views
5

Ich brauche einen regulären Ausdruck zu validieren einen Zeitstempel des Formats zu validieren, mit Javascript:Regular Expression einen Zeitstempel

YYYY/MM/DD HH: MI: SS

I Ich habe versucht, ein paar zu kochen, aber meine Regex-Fähigkeiten scheinen etwas zu verbergen.

Bitte geben Sie mir eine Referenz oder eine Möglichkeit, es zu tun.

P.S. : Ich erwähne Regex, nur als Anregung. Ich benutze Javascript und begrüße jede Alternative.

+7

Ist 2009/14/35 27:63:60 gültig? Wenn nicht, wird es mit Regexen hässlich sein. – balpha

+0

Welche Sprache verwenden Sie? Wenn dies Perl ist, können Sie Code aus der Regex aufrufen, was wahrscheinlich die einzige Möglichkeit ist, eine leicht lesbare Überprüfung durchzuführen. Nur der Code zu validieren, wenn es ein Schaltjahr ist, um zu überprüfen, ob der 29. Februar existiert, würde das Ding hässlich machen, wenn alle rauskommen. –

+0

Ich erwähne Regex, nur als Vorschlag. Ich benutze Javascript und begrüße jede Alternative. –

Antwort

16

Ich würde empfehlen, Datejs dafür zu verwenden. Es ist nicht notwendig, das Datum selbst zu analysieren, und ein Regex reicht nicht aus, um einen Zeitstempel zu validieren. Mit datejs könnten Sie die Zeichenfolge in einem Datum analysieren und Sie werden null, wenn seine ungültig:

Date.parse("2009/06/29 13:30:10", "yyyy/MM/dd HH:mm:ss"); 
+0

Danke! Es tut, was ich brauche. –

0

Perl Stil: [12] \ d {3}/[01] \ d/[0-3] \ d [0-2] \ d (? :: [0-5] \ d) { 2}

+0

Wenn Sie keine Schaltsekunden benötigen. –

5

wenn Sie nur die Syntax überprüfen möchten, hier ist die POSIX regex:

[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} 

Aber wenn man die Semantik überprüfen möchten, würde ich die Zeichenfolge mit der Sprache Ihrer Wahl verarbeiten, gibt es zu viele Fälle können Sie nicht mit regulären Ausdrücken (wie Schaltjahren/Sekunden, Sommerzeit, usw.) abdecken

+0

ich denke, es wäre besser, es als [0-9] {4,4}/[0-9] {2,2}/[0-9] {2,2} [0-9] { 2,2}: [0-9] {2,2}: [0-9] {2,2} –

+1

Je nach Ihren Bedürfnissen, ja. Aber Sie können {x} anstelle von {x, x} verwenden. – soulmerge

0

Regular-Expressions.info ist eine nette Quelle von in Bildung über RegEx, hat es auch eine gute tutorial.

+1

Ein Kommentar, warum dies abgelehnt wird, würde sehr geschätzt werden. Ich kann nicht sehen, warum eine Verbindung zu einer RegEx-Referenz-Website sollte downvoted werden, vor allem wenn es in der Frage "Bitte geben Sie mir einen Verweis oder eine Möglichkeit, es zu tun". – RuudKok

0

Mit

(\d\d)?\d\d\/\d\d?/\d\d? \d\d?:\d\d:\d\d 

die Syntax bestätigen konnte, aber als balpha weist darauf hin, das macht es kein gültiges Datum machen.

6

Sie sollten dies nicht mit regulären Ausdrücken tun, sondern nur die Zeichenfolge durch DateTime mit der richtigen Formatzeichenfolge ausführen. Auf diese Weise können Sie sicherstellen, dass es sich tatsächlich um einen gültigen Zeitstempel handelt und nicht nur um etwas, das so aussieht.

1
function validateTimestamp(timestamp) { 

    if (!/\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/.test(timestamp)) { 
     return false; 
    } 

    var split = timestamp.split(/[^\d]+/); 

    var year = parseFloat(split[0]); 
    var month = parseFloat(split[1]); 
    var day = parseFloat(split[2]); 

    var hour = parseFloat(split[3]); 
    var minute = parseFloat(split[4]); 
    var second = parseFloat(split[5]); 

    return hour < 25 && minute < 61 && second < 61 && month < 13 && day < 32; 

} 
3

Hier ist eine regex ich heute früher schrieb für Streicher in einem Format ähnlich zu validieren, was Sie erwähnt: YYYY-MM-DD hh:mm:ss. Es identifiziert nicht einige schlechte Daten (zum Beispiel, 30. Februar), aber kann etwas besser sein als die Verwendung der vereinfachten \d an jeder Position.Dinge zu beachten:

  1. Sie nur ein Datum angeben, nur eine Zeit oder beides Datum + Uhrzeit
  2. Zeit kann
  3. Sekunden sind optional
  4. in 12-Stunden oder 24-Stunden-Format

    am/pm ist optional

    const std::string dateAndTimeRegex = 
        "^\\s*"      // ignore whitespace 
        "("       // start of date 
         "201[0-9]"    // year: 2010, 2011, ..., through 2019 
         "\\W"     // delimiter between year and month; typically will be "-" 
         "([0]?[0-9]|1[012])" // month: 0 through 9, or 00 through 09, or 10 through 12 
         "\\W"     // delimiter between month and day; typically will be "-" 
         "([012]?[0-9]|3[01])" // day: 0 through 9, or 00 through 29, or 30, or 31 
        ")?"      // end of optional date 
        "\\s?"      // optional whitespace 
        "("       // start of time 
         "([01]?[0-9]|2[0-3])" // hour: 0 through 9, or 00 through 19, or 20 through 23 
         "\\W"     // delimiter between hours and minutes; typically will be ":" 
         "([0-5][0-9])"   // minute: 00 through 59 
         "("      // start of seconds (optional) 
          "\\W"    // delimiter between minutes and seconds; typically will be ":" 
          "([0-5][0-9])"  // seconds: 00 through 59 
         ")?"     // end of optional seconds 
         "(\\s*[AaPp][Mm])?"  // optional AM, am, PM, pm 
        ")?"      // end of optional time 
        "\\s*$";     // trailing whitespace 
    
4

ich eine Regex nur schrieb einen MySQL Datetime zu steuern (und ich denke, dass es nicht so diff ist für Oracle oder andere Datenbankserver).

Dieser ReGex ist sehr sicher und kontrolliert die Gültigkeit des Datums (Monate in 28, 30 & 31 Tage und sogar Jahre mit 29/02). Dann steuert es die Zeit. Der Zeitstempel-Format ist diese:

YYYY-MM-DD HH: MM: SS

Hier ist die Regex (ziemlich lang):

((((19|20)([2468][048]|[13579][26]|0[48])|2000)-02-29|((19|20)[0-9]{2}-(0[4678]|1[02])-(0[1-9]|[12][0-9]|30)|(19|20)[0-9]{2}-(0[1359]|11)-(0[1-9]|[12][0-9]|3[01])|(19|20)[0-9]{2}-02-(0[1-9]|1[0-9]|2[0-8])))\s([01][0-9]|2[0-3]):([][0-9]):([][0-9])) 

Spiele

2013-04-05 17:59:59 | 2013-07-30 01:22:42 | 2099-12-30 23:59:59 | 2016-02-28 00:00:00

Nicht Spiele

2016-02-29 -01: 01: 02 | 3000-04-24 17:42:21 | 2012-03-03 24:24:02 | 2012-03-03 21:60:45

Ich glaube nicht, dass ich einen gesicherter machen kann. Sehr funktionell und getestet. Bitte, wenn Sie es verwenden, zögern Sie nicht, mir Feedback zu geben;)

FYI: Wenn Sie nur die Steuer Datum Regex ohne Zeit suchen, gehen dort bitte es zu finden: Regular Expression to match valid dates (mein Beitrag überprüfen) .

Prost

1

Für ein gültiges Datum zwischen Jahr 1000 und das Jahr 2999 Gebrauch:

String pattern = "((1\\d{3})|(20\\d{2}))-((0\\d)|(1[0-2]))-(([1-2]\\d)|(3[0-1])) (([0-1]\\d)|(2[0-3])):([0-5]\\d):([0-5]\\d)"; 

Die Monate zwischen 01 und 12, die Tage zwischen 01 und 31 und der Zeit zwischen 00:00 variieren kann : 00 und 23:59:59.

0
function isTimestamp($input){ 
      var $regex = /^\d\d\d\d-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$/; 
      return $regex.test($input); 
     } 

Scheck bitte