2016-08-23 4 views
0

Ich mache eine einfache App, die Informationen über Restaurants in der Nähe abruft. Ich bekomme alle Daten von einem externen Webservice. Jedes Restaurantobjekt hat eine NSDictionary, die die Arbeitszeiten des jeweiligen Restaurants enthält. Diese NSDictionary ist wie so strukturiert ..Überprüfen Sie, ob die aktuelle Zeit zwischen zwei NSDate (iOS)

"restaurant_working_hours" =   (
        { 
      close =     { 
       day = 1; 
       dayName = Monday; 
       time = 0000; 
      }; 
      open =     { 
       day = 1; 
       dayName = Monday; 
       time = 1500; 
      }; 
     }, 
        { 
      close =     { 
       day = 2; 
       dayName = Tuesday; 
       time = 0000; 
      }; 
      open =     { 
       day = 2; 
       dayName = Tuesday; 
       time = 1500; 
      }; 
     }, 
        { 
      close =     { 
       day = 3; 
       dayName = Wednesday; 
       time = 0000; 
      }; 
      open =     { 
       day = 3; 
       dayName = Wednesday; 
       time = 1500; 
      }; 
     }, 
        { 
      close =     { 
       day = 4; 
       dayName = Thursday; 
       time = 0000; 
      }; 
      open =     { 
       day = 4; 
       dayName = Thursday; 
       time = 1500; 
      }; 
     }, 
        { 
      close =     { 
       day = 5; 
       dayName = Friday; 
       time = 0000; 
      }; 
      open =     { 
       day = 5; 
       dayName = Friday; 
       time = 1500; 
      }; 
     } 
    ); 

In meiner app ich eine Option benötigen, um herauszufinden, ob das Restaurant offen oder geschlossen ist jetzt. Und auch die Arbeitszeiten des Tages im 12-Stunden-Format.

Ich bin relativ neu in der Entwicklung und habe keine Ahnung, wie ich das angehen soll. Ich könnte es einfach in einer Schleife laufen lassen und alle Daten bekommen, aber das scheint ineffizient.

Danke :)

+0

überprüfen first.If Sie, dass die Antwort bitte schließen – user3182143

+0

bekommen Link Scheint, wie Sie es 'NSDate' erste – Tj3n

+0

ok Ich stimme dein Wort zu konvertieren, können Sie Ihr versucht, Code –

Antwort

0

Sie nicht NSDate den Vergleich zu tun, verwenden können. Sie müssen:

  1. Holen Sie sich das aktuelle Datum/Uhrzeit (als NSDate) und extrahieren Sie die aktuelle Zeit in Sekunden ab Mitternacht.
  2. Konvertieren Sie diese Zeit aus den Wörterbüchern in Sekunden ab Mitternacht. Es ist in einem seltsamen Format und ich gehe beispielsweise davon aus, dass 1326 "26 Minuten nach 1 PM" wäre.

1:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comps = [calendar components:(NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond) 
             fromDate:[NSDate date]]; 
NSInteger nowSeconds = ([comps hour] * 60 * 24) + ([comps minutes] * 60) + [comps seconds]; 

2:

+ (NSInteger)dictTimeToSeconds:(NSInteger)dictTime 
{ 
    NSInteger hours = dictTime/100; 
    NSInteger minutes = dictTime % 100; 
    return (hours * 60 * 24) + (minutes * 60); 
} 

... 

NSArray *workingHours = thatDictionary[@"restaurant_working_hours"]; 
for (NSDictionary *days in workingHours) { 
    NSInteger openTime = [self dictTimeToSeconds:days[@"open"][@"time"]]; 
    NSInteger closeTime = [self dictTimeToSeconds:days[@"close"][@"time"]]; 
    if (openTime < nowSeconds && closeTime > nowSeconds) { 
     NSLog(@"Open on day %@", days[@"open"][@"dayName"]); 
    } else { 
     NSLog(@"Closed on day %@", days[@"open"][@"dayName"]); 
    } 
} 

Anmerkung: Die Struktur des Serverdaten unnötig kompliziert.

+0

Ich stimme zu. Aber ich kann die Struktur nicht ändern. Ich bekomme die Daten von Google Places API. –

+0

OK, aber funktioniert der Code? – Droppy

+0

Ja. Es klappt. Aber mit ein paar Veränderungen. Ich werde posten, was ich in den Antworten getan habe. Danke vielmals :) –

0

Dank @ Droppy..dies ist genau das, was ich in meinem Code getan habe.

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"EEEE"]; 
NSString *dayName = [dateFormatter stringFromDate:[NSDate date]] 

NSString *predicateString = [NSString stringWithFormat:@"close.dayName like '%@'",dayName]; 
NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString]; 
NSArray *result = [restaurantWorkingHoursDict filteredArrayUsingPredicate:pred]; 

NSMutableDictionary *todayDict = [result firstObject]; 

NSString *closeString = [[todayDict objectForKey:@"close"] objectForKey:@"time"]; 
NSString *openString = [[todayDict objectForKey:@"open"] objectForKey:@"time"]; 

NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; 
[outputFormatter setDateFormat:@"HHmm"]; 

NSDate *openDate = [outputFormatter dateFromString:openString]; 
NSDate *closeDate = [outputFormatter dateFromString:closeString]; 

[outputFormatter setDateFormat:@"h:mm a"]; 

NSString *openingHour = [outputFormatter stringFromDate:openDate]; 
NSString *closingHour = [outputFormatter stringFromDate:closeDate]; 

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comps = [calendar components:(NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond) 
             fromDate:[NSDate date]]; 
NSInteger nowSeconds = ([comps hour] * 60 * 60) + ([comps minute] * 60) + [comps second]; 

NSInteger closeSecond = [self dictTimeToSeconds:[closeString integerValue]]; 
NSInteger openSecond = [self dictTimeToSeconds:[openString integerValue]]; 

if (openSecond < nowSeconds && closeSecond > nowSeconds) { 
    self.openLebal.text = [NSString stringWithFormat:@"Open Now from:%@ till:%@",openingHour,closingHour]; 
} else { 
    self.openLebal.text = [NSString stringWithFormat:@"Closed Now. Open from:%@ till:%@",openingHour,closingHour]; 
} 

.... 

- (NSInteger)dictTimeToSeconds:(NSInteger)dictTime{ 
    NSInteger hours = dictTime/100; 
    NSInteger minutes = dictTime % 100; 
    return (hours * 60 * 60) + (minutes * 60); 
} 

Ein paar Änderungen vorgenommen. Hoffe, das wird jemand anderem helfen. es

Verwandte Themen