在iOS中检查文件创建日期时出现问题

时间:2013-06-23 12:32:02

标签: iphone ios objective-c

我有一个文件,我需要根据其创建日期用新文件替换此文件,因此如果此文件的创建日期是在06/23/2013之前,那么我将删除它并添加新文件所以新创建日期将是2013年6月23日,但如果创建日期等于或等于2013年6月23日,则不执行任何操作。

当在开发环境中应用上述逻辑时,一切都没有问题,但是当我将其部署到生产(iTunes)时,条件= true表示代码始终在06/23/2013之前进入条件并删除文件并创建一个新文件。

我的代码是:

if ([fileManager fileExistsAtPath:writableDBPath]) {
NSDate *creationDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:writableDBPath error:&error] objectForKey:NSFileCreationDate];

BOOL result = NO;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *issueDate = [dateFormatter dateFromString:@"2013-05-22"];

NSDateComponents *creationDateComponents = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:creationDate];
NSDateComponents *issueDateComponents = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:issueDate];

NSTimeInterval secondsBetweenCreationIssue = [[CURRENT_CALENDAR dateFromComponents:creationDateComponents] timeIntervalSinceDate:[CURRENT_CALENDAR dateFromComponents:issueDateComponents]];

if ((lround((secondsBetweenCreationIssue/86400))) <= 0) {
    result = YES;
}
else{
    result = NO;
}
//if the file is OLD
if (result) {
    [fileManager removeItemAtPath:writableDBPath error:&error];
}

1 个答案:

答案 0 :(得分:2)

首先,你不应该像这样使用NSDateFormatterNSDateFormatter创建起来很昂贵,而且使用起来很昂贵。由于您完全了解日期,因此我建议您使用NSDateComponents创建issueDate

NSDateComponents *issueDateComponents = [[NSDateComponents alloc] init];
issueDateComponents.day = 23;
issueDateComponents.month = 6;
issueDateComponents.year = 2013;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdenfier:NSGregorianCalendar];
NSDate *issueDate = [gregorian dateFromComponents:issueDateComponents];

(请注意,我使用格里高利历,因为您的日期似乎来自该日历。用户当前日历可能是另一个,并且该日期不起作用。)

第二件事。您应该提取日期组件,并使用它们进行比较,而不是硬编码一天中的秒数;

if ([fileManager fileExistsAtPath:writableDBPath]) {
  NSDate *creationDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:writableDBPath error:&error] objectForKey:NSFileCreationDate];

  // Here should be the code from the previous example

  // Again, use a gregorian calendar, not the user current calendar, which
  // could be whatever. I'm not sure every calendar has the same days and
  // months, so we better be sure.
  NSDateComponents *creationDateComponents = [gregorian components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:creationDate];
  creationDate = [gregorian dateFromComponents:creationDateComponents];

  if ([creationDate compare:issueDate] == NSOrderedAscending) {
    [fileManager removeItemAtPath:writableDBPath error:&error];
  }
}

(您应该检查时区是否以任何方式影响此计算,我不确定。)

我认为您在代码中遇到的问题是使用用户当前日历(和区域设置),这会影响NSDateFormatter解析日期的方式,以及时间间隔的复杂计算。

另一件令我烦恼的事情是,如果YES距离不到1天,您的旗帜只会设置为secondsBetweenCreationIssue,但是最早的日期将无法通过测试

希望它有所帮助。