1

我有一个文件,我需要根据它的创建日期用新文件替换这个文件,所以如果这个文件的创建日期在 2013 年 6 月 23 日之前,那么我将删除它并添加新文件,这样新的创建日期为 06/23/2013,但如果创建日期晚于或等于 2013 年 6 月 23 日,则什么也不做。

在开发环境中应用上述逻辑时,一切正常,没有问题,但是当我将其部署到生产环境(iTunes)时,条件 = true 这意味着代码始终在 2013 年 6 月 23 日之前进入条件并删除文件并创建一个新文件.

我的代码是:

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];
}
4

1 回答 1

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解析日期的方式以及您对时间间隔的复杂计算。

让我烦恼的另一件事是,看起来您的标志只有在距离不到 1 天的情况下才会设置为YESsecondsBetweenCreationIssue但比这更早的日期不会通过测试。

希望能帮助到你。

于 2013-06-23T14:49:27.547 回答