0

間違った日付が表示されるのはなぜですか?

 NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSLog(@"start date is %@",startDate1);

開始日は 2013-06-28 03:00:00 +0000 です

編集

私がやりたいことは次のとおりです。開始と終了があります。

例えば:

開始日は 2013-06-28 05:00 です

終了日: 2013-06-29 04:59

次に、現在の日付が開始日と終了日の間にあるかどうかを確認したいと思います。私は以下を使用しています。

NSComparisonResult result1 = [now compare:startDate1];
    NSComparisonResult result2 = [now compare:endDate1];

if (result2 == NSOrderedSame && result1 == NSOrderedSame ) {
        NSLOG(@"OKE!");
 }
4

3 に答える 3

3

おそらく日付は正しいですが、ログを誤解しています:

日付の記録は常に TZ +0000 で行われます。たとえば、中央ヨーロッパにいる場合、(予想される?) 日付は 2013-06-28 05:00:00 +0200 ですが、ログには正規化された日付 2013-06-28 03:00:00 が表示されます。 +0000。これは同じ日時です!それは単に別の方法で表現されます。

+++

コンポーネントも TZ +0000 にある場合は、カレンダーのタイム ゾーンを設定する必要があります。

于 2013-05-13T11:14:55.683 に答える
1

次のように、現在の日付が 2 つの日付の間にあるかどうかを確認できます。

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);

あなたのコードは実際に、テストされた日付が開始日と終了日の両方と等しい(NSOrderedSame)かどうかをチェックします(もちろんそうではありません)

result2 == NSOrderedSame && result1 == NSOrderedSame

私の拡張例を見てください:

NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
[components setYear:2013];
[components setMonth:05];
[components setDay:13];
[components setHour:18];
[components setMinute:00];
NSDate *startDate = [myCalendar dateFromComponents:components];
[components setDay:15];
NSDate *endDate = [myCalendar dateFromComponents:components];

NSDate *now = [NSDate date];
BOOL betweenStartAndEnd = ([startDate compare:now] == NSOrderedAscending && [endDate compare:now] == NSOrderedDescending);

NSLog(@"Date %@ %@ between %@ and %@", now, betweenStartAndEnd ? @"IS" : @"IS NOT", startDate, endDate);

これにより、コンソールに次のように出力されます。

Date 2013-05-13 15:44:06 +0000 IS NOT between 2013-05-13 16:00:00 +0000 and 2013-05-15 16:00:00 +0000
于 2013-05-13T15:56:32.203 に答える