Iphone 目标-c如何在GMT时区获得没有时间成分的日期?

Iphone 目标-c如何在GMT时区获得没有时间成分的日期?,iphone,ios,objective-c,timezone,nsdate,Iphone,Ios,Objective C,Timezone,Nsdate,我得到了一个代码片段,它接受一个日期,并试图将其转换为一个没有时间组件的日期。然后,我使用这个修剪过的数据来保存/提取核心数据 -(NSDate*)dateWithNoTimeComponents:(NSDate*)startDate { // NSCalendar *calendar = [NSCalendar currentCalendar]; NSNumber* count = 0; int secondsPerDay = 86400; //

我得到了一个代码片段,它接受一个日期,并试图将其转换为一个没有时间组件的日期。然后,我使用这个修剪过的数据来保存/提取核心数据

-(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时区,这个方法生成的修剪日期仍然正确吗我是否需要在此计算中包含时区偏移/夏令时以使其全局正确?

最好的做法是遵循SDK惯例,以GMT进行所有操作,仅转换为本地时区供用户查看

您的代码计算时间和分钟数,这就为边缘情况留下了出错的机会。最好让sdk来计算。要获得给定日期的0小时,请尝试以下操作

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:startDate];
NSDate *justTheDay = [calendar dateFromComponents:components];

我也曾采用与相同的解决方案,但它太耗时了(在“时间分析器”中大约为1642.0msCPU时间)。它让我的整个应用程序慢了好几次

最后,我找到了,并将其用于我的最终方法:

// 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.0msCPU时间


对我来说,这是一个更好的解决方案。

答案很好,我完全没有意识到我只能用年、月、日来表示没有时间的日期