1

日付を取り、それを時刻コンポーネントなしで日付に変換しようとするコード スニペットを取得しました。次に、このトリミングされたデータを使用して、コア データからの保存/フェッチを行います。

-(NSDate*)dateWithNoTimeComponents:(NSDate*)startDate
{

    //
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSNumber* count = 0;
    int secondsPerDay = 86400;


    //break the date and create fractional components for that date
    NSDateComponents *components = [calendar components:(NSWeekdayCalendarUnit| NSHourCalendarUnit | NSMinuteCalendarUnit|NSSecondCalendarUnit) fromDate:startDate];

    NSInteger hour = [components hour];
    NSInteger minute = [components minute];
    NSInteger second = [components second];

    //update daily count
    //remove fractional componets from the date, effectively creating a key per day
    return  [NSDate dateWithTimeInterval:-((hour*60+minute)*60+second) sinceDate:startDate];
}

私の懸念は、これが異なるタイムゾーンの日付では機能しない可能性があることです. 異なるタイムスタンプから日付を入れると、このメソッドに影響しますか? たとえば、GMT -5 タイムゾーンにいて、GMT -8 タイムゾーンに移動した場合、この方法で生成されたトリミングされた日付は正しいでしょうか? グローバルに正確にするために、この計算のどこかにタイムゾーン オフセット/夏時間を含める必要がありますか?

4

2 に答える 2

2

最善の方法は、すべてを GMT で実行し、ユーザーが確認できるようにローカル タイムゾーンにのみ変換するという SDK の規則に従うことです。

コードは時間と分で計算を行うため、エッジ ケースでエラーが発生する可能性があります。SDKに計算を任せたほうがいいです。特定の日付のゼロ時間を取得するには、次のようにしてください...

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:startDate];
NSDate *justTheDay = [calendar dateFromComponents:components];
于 2013-06-13T16:52:59.803 に答える
0

私もdanhと同じソリューションを使用していましたが、時間がかかりすぎました( Instruments ''Time Profiler''で約1642.0msの CPU 時間)。それを数回使用すると、アプリ全体が遅くなりました。

最後に、 この答えを見つけて、最終的な方法で使用しました。

// this method takes around 100ms CPU-time (measured with instruments)
- (NSDate*) truncateDate : (NSDate*) date
          toCalendarUnit : (NSCalendarUnit) calendarUnit 
{
    NSDate *truncatedDate;
    [[NSCalendar currentCalendar] rangeOfUnit : calendarUnit
                                    startDate : &truncatedDate
                                     interval : NULL
                                      forDate : date];
    return truncatedDate;
}

この方法では、約100.0 ミリ秒の CPU 時間しかかかりませんでした。

私にとって、これはより良い解決策です。

于 2013-06-19T12:20:18.460 に答える