0

Web サービスから Core Data に 26 レコードを取得するアプリがあります。フェッチで 26 レコードすべてを取得します。次に、「hor_LV」と呼ばれるフィールドの 1 つを取得し、TimeComparator クラス メソッドを実行します。そのフィールドから開始時間と終了時間を取得し、それを現在と比較します。

現時点では、hor_LV に従って、26 のすべてのロケーションが開かれているはずです。しかし、3つは閉じて戻ってきます。比較対象の日付を調べたところ、これが得られたものです...そして、これが私の TimeComparator クラスメソッドです:

    +(BOOL)dealWithTimeStrings2:(NSString*)timeString{
    //1. Receive Time String in format date - openTime - closeTime
    NSString *s = timeString;

    NSString *stripped = [s stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSArray *timeStringsArray2 = [stripped componentsSeparatedByString:@"-"];

    NSLog(@"timeStringsArray2 %@", timeStringsArray2);

    //3. Create NSDateFormatter
    NSDateFormatter *dateFormatter = [NSDateFormatter new];
    [dateFormatter setDateFormat:@"hh:mma"];
    [dateFormatter setDefaultDate: [NSDate new]];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"MST"]];

    //3.5 SET LOCALE
    NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
    assert(enUSPOSIXLocale != nil);
    [dateFormatter setLocale:enUSPOSIXLocale];

    //4. Get strings from Array
    NSString *openDateString = (NSString*)[timeStringsArray2 objectAtIndex:0];
    NSString *closeDateString = (NSString*)[timeStringsArray2 objectAtIndex:1];
    NSLog(@"someDateString %@,%@", openDateString,closeDateString);

    NSDate *openDate = [dateFormatter dateFromString: openDateString];
    NSDate *closeDate = [dateFormatter dateFromString: closeDateString];
    NSLog(@"DEALWITHTIMESTRINGS = open, now, close %@,%@,%@", openDate,[NSDate date], closeDate);

    BOOL status;

    //8. Send dates to timeCompare method & return some value
    if ([self timeCompare:openDate until:closeDate]) {
        NSLog(@"TIMECOMPARATOR = timeCompare>OPEN");
        status = YES;
    } else {
        NSLog(@"TIMECOMPARATOR = timeCompare>CLOSED");
        status = NO;
    }

    return status;
}

そして、これは正しいレコードと 2 つの間違ったレコードのログです。

    -timeStringsArray2 (
    "7:30AM",
    "12:00PM"
)
-someDateString 7:30AM,12:00PM
-DEALWITHTIMESTRINGS = open, now, close 2013-08-22 13:30:01 +0000,2013-08-22 23:53:01 +0000,2013-08-22 18:00:01 +0000
-TIMECOMPARE = open:2013-08-22 13:30:01 +0000 now:2013-08-22 23:53:01 +0000 close:2013-08-22 18:00:01 +0000
-TIMECOMPARATOR = timeCompare>CLOSED

-timeStringsArray2 (
    "7:30AM",
    "9:00PM"
)
-someDateString 7:30AM,9:00PM
-DEALWITHTIMESTRINGS = open, now, close 2013-08-22 13:30:01 +0000,2013-08-22 23:53:01 +0000,2013-08-23 03:00:01 +0000
-TIMECOMPARE = open:2013-08-22 13:30:01 +0000 now:2013-08-22 23:53:01 +0000 close:2013-08-23 03:00:01 +0000
-TIMECOMPARATOR = timeCompare>OPEN

2 番目のインスタンスは開いており、現在は 8-22 日ですが、終了時間は 8-23 です。

最初のインスタンスは、開いているため閉じられ、現在は 8-22 であり、閉じる時間も同じです。

オンラインで現在の MST 時刻とその午後 5 時 53 分を確認したので、+6 = 午後 11 時 53 分で問題ないようです。

原因はわかっています。開店時間は午前 7 時 30 分 + 6 時間 = 開店時間 13:30:00 です。同様に、午後 6 時 1 分は午後 11 時 53 分になります。違いは、閉店時間は午後 9 時 + 6 時間 = 翌日の午前 3 時ですが、閉店時間は午後 12 時です。

では、どうすればそれを説明または修正できますか?

4

1 に答える 1

1

「調整された」日付文字列を作成する際に、特に余分な作業を行っているようです。具体的には、文字列から始めて、現在の時刻からいくつかのコンポーネントを抽出し、いくつかのコンポーネントを追加して (そのうちの 1 つである日が問題の原因である可能性があります)、日付を解析します。

おそらくこれはより直接的です:

  NSDateFormatter *dateFormatter = [NSDateFormatter new];
  [dateFormatter setDateFormat: @"h:mma"];
  [dateFormatter setDefaultDate: [NSDate new]];
  [dateFormatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @"MST"]];
  // Notice use of setDefaultDate: and the setDateFormat: argument

  // Now parse your two date strings (one shown) in your original format
  NSString *timeOne = @"7:00AM";

  NSDate *dateOne = [dateFormatter dateFromString: timeOne];

  // Do the comparison; for debug, print stuff.
  NSLog (@"\n  Time: %@\n  Date: %@", timeOne, date);

setDefaultDate:不足しているすべてのものを追加して、年、月、日、秒を取得します。おそらく、秒をゼロにする必要があるか、比較しているだけなので、そのままにしておくことができます。

時間が翌日に戻った疑いがある場合は、次のいずれかを使用して、各解析の前にデフォルトの日付をリセットします。

  NSDate *now = [NSDate new];
  NSDate *nxt = [now dateByAddingTimeInterval: (24 * 60 * 60)];
于 2013-08-22T22:48:21.350 に答える