datum auf Gültigkeit überprüfen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • datum auf Gültigkeit überprüfen

    hallo alle zusammen,

    in meiner app (swift 2; ios 9) gibt es eine variable datum : String

    diese erhält ein Datum in unterschiedlichen Formaten, z.B.
    • TT.MM.JJJJ
    • MM.JJJJ
    • MM/JJ
    • MM/JJJJ
    • TT/MM/JJJJ


    bislang überprüfe ich das Datum so auf Gültigkeit:

    Quellcode

    1. let dateFormatter = NSDateFormatter()
    2. dateFormatter.dateFormat = "dd.MM.yyyy"
    3. let date = dateFormatter.dateFromString(datum)
    4. if date != nil {
    5. print("Datum OK")
    6. } else {
    7. print ("Datum nicht OK")
    8. }

    Das funktioniert im Moment nur mit dem Format TT.MM.JJJJ
    Gibt es jetzt eine elgante Variante alle o.g. auf Formate auf ein Mal auf Gültigkeit zu überprüfen?
  • okay ist doch komplizierter als gedacht.

    wolle erst Mal herausfinden, welches format das Datum hat, in dem ich es so prüfe:

    Quellcode

    1. if datum.rangeOfString(".") != nil {
    2. print("Datum mit .")
    3. } else {
    4. print ("Datum mit /")
    5. }

    aber wie kann ich jetzt überprüfen,

    ob das ein Datum mit Tag ist und ob das Jahr im Format JJJJ oder JJ vorliegt?
  • weil mit der app ein qrcode gescannt wird, in dem ein datum enthalten ist (im zufälligen Format wie aus Post 1)
    und dieses hinterlege ich nach dem scan 1:1 in eine string variable.

    siehst du da die Möglichkeit das direkt als NSDate zu speichern?
  • Nein, dasselbe Problem nur vorgelagert.

    Am Stabilsten dürfte hier wirklich eine kluge Anwendung von Regular Expression sein.
    Nicht nur, dass Du damit herausfinden kannst, ob ein unterstütztes Format vorliegt – Du findest damit dann auch noch heraus, welches der unterstützen Formate es ist.

    Allerdings ist meine RegEx Zeit lange her, ich weiß nur noch, dass es mit geschickten Verkettungen und Klammerungen geht – aber nicht mehr wie.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Bei mir kam das Datum nicht aus einem QR sondern aus einer Webseite lustig gemischt mit dem amerikanischen Format. NSDataDetector kam damit nicht immer klar.

    Musst du nur noch nach Swift übersetzen. Und nach Fehlern abklopfen. Ich habs nur für einen einmaligen Lauf gebraucht.

    C-Quellcode

    1. - (NSDate *) dateFromString: (NSString *)dateString
    2. {
    3. BOOL isAmiFormat = ([dateString rangeOfString: @"."].location == NSNotFound);
    4. NSCharacterSet *delimiter = [NSCharacterSet characterSetWithCharactersInString: @"./-"];
    5. NSMutableArray *parts = [[dateString componentsSeparatedByCharactersInSet: delimiter] mutableCopy];
    6. if (parts.count < 2 || parts.count > 3)
    7. return nil;
    8. BOOL noDay = (parts.count == 2);
    9. NSDateComponents *components = [[NSDateComponents alloc] init];
    10. components.day = noDay ? 1 : isAmiFormat ? [parts[1] integerValue] : [parts[0] integerValue];
    11. components.month = noDay ? [parts[0] integerValue] : isAmiFormat ? [parts[0] integerValue] : [parts[1] integerValue];
    12. NSInteger year = noDay ? [parts[1] integerValue] : [parts[2] integerValue];
    13. if (year < 100)
    14. year += 2000;
    15. components.year = year;
    16. NSDate *date = [[NSCalendar currentCalendar] dateFromComponents: components];
    17. return date;
    18. }
    Alles anzeigen
    Chris
    Man macht einfach solange irgendwelche Dinge, bis man tot ist.
    Und dann bekommen die anderen Kuchen.
  • vielen dank chris.

    habs doch mal versucht umzuschreiben.
    wäre das so logisch / richtig?

    C-Quellcode

    1. func dateFromString(dateString: String) -> NSDate {
    2. var isAmiFormat: Bool = dateString.rangeOfString(".") != nil
    3. var delimiter: NSCharacterSet = NSCharacterSet(charactersInString: "./-")
    4. var parts: [AnyObject] = dateString.componentsSeparatedByCharactersInSet(delimiter)
    5. if parts.count < 2 || parts.count > 3 {
    6. return false
    7. }
    8. var noDay: Bool = (parts.count == 2)
    9. var components: NSDateComponents = NSDateComponents()
    10. components.day = noDay ? 1 : isAmiFormat ? parts[1].integerValue : parts[0].integerValue
    11. components.month = noDay ? parts[0].integerValue : isAmiFormat ? parts[0].integerValue : parts[1].integerValue
    12. var year: Int = noDay ? parts[1].integerValue : parts[2].integerValue
    13. if year < 100 {
    14. year += 2000
    15. }
    16. components.year = year
    17. var date: NSDate = NSCalendar.currentCalendar().dateFromComponents(components)!
    18. return date
    19. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Ghost108 ()

  • little_pixel schrieb:

    Es gibt doch NSDataDetector…

    Kann das nicht dafür angewandt werden?

    Chris schrieb:

    NSDataDetector kam damit nicht immer klar.
    ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ghost108 schrieb:

    Quellcode

    1. if datum.rangeOfString(".") != nil {
    2. print("Datum mit .")
    3. } else {
    4. print ("Datum mit /")
    5. }

    Wenn du das von Hand zu Fuss machen willst, dann checkst du besser anders :


    Quellcode

    1. var dateParts: [String] = []
    2. if datum.containsString(".") {
    3. print("Datum mit .")
    4. dateParts = datum.componentsSeparatedByString(".")
    5. } else {
    6. print ("Datum mit /")
    7. dateParts = datum.componentsSeparatedByString("/")
    8. }
    Danach hast du in dateParts[0], ... deine einzelnen Teile, die du weiter untersuchen kannst
    Es gibt zwei Dinge, die sind unendlich. Das Universum und die menschliche Dummheit. Wobei beim Universum bin ich mir nicht sicher - Albert Einstein
  • im prinzip kann man gar nicht wissen was 10/12/2012 sein soll. denn es könnte zb das amerikanische format MM/DD/YYYY sein oder eben das italienische DD/MM/YYYY (ja die verwenden auch den slash statt dem punkt, haben aber so wie die deutschen die tage vorne). bei 13/12 oder 12/13 ist es natürlich wieder klar was es sein muss...