0

最近の Do Not Disturb バグ ( Ars Technica リンク) が私のコードに影響を与えているかどうかを確認しようとしています。前の月曜日の真夜中の日付とタイムスタンプを取得しようとしています。私は月曜日にこれを書いているので、今日の日付 (2013 年 1 月 7 日) を取得することを期待しますが、それでも私は 2013 年 1 月 4 日です。

Apple が投稿したガイドに従っていますが、日曜日ではなく前の月曜日を見つけるように変更しようとしています。

+(NSTimeInterval)StartOfWeekMonday {
    NSTimeInterval finalTime = -1;

    NSInteger weekday;

    NSDate *monday  = 0;

    NSCalendar *greg = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *weekdays = [greg components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
    NSDateComponents *subtract = [[NSDateComponents alloc] init];
    NSDateComponents *final    = 0;

    weekday = ( weekdays.weekday == 1 ) ? 6 : weekdays.weekday;

    [subtract setDay:(0 - weekday - 1)];

    monday = [greg dateByAddingComponents:subtract toDate:[NSDate date] options:0];
    final  = [greg components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:monday];
    monday = [greg dateFromComponents:final];

#ifdef DEBUG
    NSLog( @"%s - %d -> Weekday: %d", __FILE__, __LINE__, weekday );
    NSLog( @"%s - %d -> Monday: %@", __FILE__, __LINE__, [monday descriptionWithLocale:[NSLocale currentLocale]] );
#endif

    finalTime = [monday timeIntervalSince1970];


    return finalTime;
}

私のログアウトは以下のとおりです。平日は正しいですが (これを月曜日に書いています)、日付は明らかに間違っています。Monday: Monday, January 7, 2013, 12:00 AM

2013-01-07 15:07:33.792 MY-APP[5524:14c03] Weekday: 2
2013-01-07 15:07:36.757 MY-APP[5524:14c03] Monday: Friday, January 4, 2013, 12:00:00 AM Eastern Standard Time

これは現在シミュレーターにありますが、他のすべての日付計算は期待値を示しています。

最近の Do Not Disturb Bug の影響を受けている可能性が高く、期待される結果を確認するには明日 (2013 年 1 月 8 日) を待たなければならないのでしょうか、それともまったく別のものを見逃しているのでしょうか?

4

1 に答える 1

1

問題は引き算の計算方法でした。Apple から提供された例を完全に誤解しているか、十分に明確ではありませんでした。減算を計算するためのソリューションは次のとおりです。

weekday = ( weekdays.weekday == 1 ) ? 8 : weekdays.weekday;
toSubtract = ( 2 - weekday );

[subtract setDay:toSubtract];

さまざまなテストを実行すると、適切な「Monday」が生成されました。結局、これは Do Not Disturb に影響する日付のバグとは何の関係もありませんでした。

于 2013-01-07T22:20:19.603 に答える