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'中的 CPU-Time大约为1642.0ms )。它多次使用它减慢了我的整个应用程序的速度。

最后我找到 了这个答案并在我的最终方法中使用它:

// 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 回答