gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:58:15 26 4
gpt4 key购买 nike

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

当在开发环境中应用上述逻辑时,一切正常,没有问题,但是当我将其部署到生产环境 (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];
}

最佳答案

首先,你不应该那样使用 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 解析日期的方式,以及您对时间间隔。

另一件让我烦恼的事情是,如果 secondsBetweenCreationIssue 距离仅不到 1 天,但日期最早于那将不会通过测试。

希望对您有所帮助。

关于iphone - 在 iOS 中检查文件创建日期时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com