gpt4 book ai didi

iOS: NSPredicate 使用 NSDate 进行比较

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:02 26 4
gpt4 key购买 nike

我有一个名为 startDateNSDate 属性以以下格式(下图)存储在持久性存储中。

enter image description here

426174354 = 2014 年 7 月 4 日

我需要使用谓词创建 (3) NSFetchRequest

对于开始日期:

  1. fetchRequest1 使用谓词需要根据用户的设备时间获取今天日期内的所有内容。
  2. fetchRequest2 使用谓词需要根据用户的设备时间获取过去的所有内容,即昨天和之前。
  3. fetchRequest3 使用谓词需要获取 future 的所有内容,这意味着根据用户的设备时间从明天和之后开始。

下面是我目前的代码:

-(NSMutableArray *)getFetchPredicate:(NSUInteger)fetchRequestType
{
NSDate *now = [self getcurrentTime:[NSDate date]];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"dd-MM-yyyy";
format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSString *stringDate = [format stringFromDate:now];
NSDate *todaysDate = [format dateFromString:stringDate];
//today's date is now a date without time.

NSMutableArray *subpredicates;

if (fetchRequestType == 1)
{
NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"startDate == %@ ", todaysDate];
[subpredicates addObject:subPredToday];
}
else if (fetchRequestType == 2)
{
NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", todaysDate];
[subpredicates addObject:subPredPast];
}
else if (fetchRequestType == 3)
{
NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", todaysDate];
[subpredicates addObject:subPredFuture];
}
return subPredicates;
}

-(NSDate *)getcurrentTime:(NSDate*)date
{
NSDate *sourceDate = date;

NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];

NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

NSDate* deviceDateWithTime = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
return deviceDateWithTime;
}

上面的代码没有从 CoreData 中获取正确的对象。我感觉我的比较谓词不正确。我不确定如何将 startDate 中的存储时间仅转换为 Date 格式并将其应用于 Predicates 以进行比较。有什么建议吗?

最佳答案

我认为您对 todaysDate 的看法有问题。 AFAIK,NSDate 表示绝对时间点,因此您创建没有“时间”的“日期”的努力似乎是徒劳的。而且使用 NSDateFormatter 来设置日期也是不稳定的。

我认为您必须创建两个不同的 NSDate 对象:startOfCurrentDay(例如 00:00:00)和 endOfCurrentDay(例如 23:59 :59),我个人会使用 NSCalendar 来完成。如果这样做,您的提取请求谓词将是:

 if (fetchRequestType == 1)
{
NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"(startDate >= %@) AND (startDate <= %@)", startOfCurrentDay, endOfCurrentDay];
}
else if (fetchRequestType == 2)
{
NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", startOfCurrentDay];
}
else if (fetchRequestType == 3)
{
NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", endOfCurrentDay];
}

关于iOS: NSPredicate 使用 NSDate 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24534311/

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