NSString解析查找日期

时间:2012-03-30 22:34:10

标签: objective-c ios xcode nsstring eventkit

我从包含格式奇怪的日期的数据库中提取信息。

当他们被拉出时,他们的格式为:

DayOfWeek,月份日期

我正在尝试使用EventKit来选择将日期添加到用户日历。

我似乎无法找到最好的方法来做这件事。

正确方向的任何帮助或观点都会非常>非常赞赏!!

2 个答案:

答案 0 :(得分:3)

您想使用NSDateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"EEEE, MMMM d";
NSDate *date = [dateFormatter dateFromString:@"Tuesday, March 3"];
DayOfWeek,Month Date“含糊不清,所以我尽力猜测你的意思。如果我错了,你需要稍微更改格式字符串。您可以使用的字符串Here is a reference

答案 1 :(得分:1)

您的问题是此数据库的日期不明确。它没有年份信息。 NSDateFormatters不猜测日期信息。他们根据您提供的信息创建日期。由于缺少这些信息,年份将是1970年(如:与参考数据同年)。

因为数据库中保存的格式完全是愚蠢的,所以我假设这些日期总是在接下来的365天内。所以理论上你不需要保存一年的信息 然后你可以使用这样的东西从完全模糊的日期信息中找出NSDate 我们的想法是将日期从1970年(从您的字符串创建)转移到当前年份。如果今年过去(例如今天是3月31日,“Foo,3月30日”的日期将会过去)将其移至明年。

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"EEEE, MMMM d";
// the following line is important if you want that your code runs on device that are not english!
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSDate *date = [dateFormatter dateFromString:@"Wednesday, March 30"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date];

NSDateComponents *todayComponent = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];

NSInteger proposedYear = [todayComponent year];
// if supposed date would be in the past for the current year move it into next year
if ([components month] < [todayComponent month]) {
    proposedYear++;
}
if ([components month] == [todayComponent month] && [components day] < [todayComponent day]) {
    proposedYear++;
}
[components setYear:proposedYear];

date = [calendar dateFromComponents:components];


// just for logging, so you are sure that you use the correct year:
[dateFormatter setDateFormat:@"EEEE, MMMM d yyyy"];
NSLog(@"%@", [dateFormatter stringFromDate:date]);