如何在GMT时区获得一个没有时间组件的日期



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

-(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来做计算。要获取给定日期的零时,尝试这样做…

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

我也曾经采用与danh相同的解决方案,但它是太耗时(大约1642.0ms CPU-Time in Instruments' time Profiler')。我用了好几次,整个应用都变慢了。

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

// 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.0ms cpu时间。

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

相关内容

  • 没有找到相关文章

最新更新