2

给定一个参考日期,我需要找到下面的“星期三”。

需要明确的是,如果参考日期是星期二,那么它应该从一周返回星期三。

如果参考日期是星期三或更晚,则需要从下周返回下一个星期三。

重要的是它不会返回参考日期之后的星期三。

我一直在考虑使用NSDateComponents但不确定如何获得必须始终在未来的一周中的第二天。

这是我到目前为止所拥有的:

NSDate *referenceDate = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:referenceDate];
[dateComponents setWeekday:4]; // Wednesday
NSDate *followingWednesday = [calendar dateFromComponents:dateComponents];

虽然这段代码没有区分同一周过去的星期三或下一个星期三,但我的问题是存在的。

我知道我可以生成两个日期,一个来自本周,一个来自下周,然后使用 if 语句检查哪个是未来,但这似乎需要很多代码来做一件简单的事情。

有没有更好的办法?

任何帮助,将不胜感激。


更新

似乎设置工作日实际上并不影响dateComponents:NSCalendar 方法返回的日期。无论工作日设置什么,我上面的示例代码都会返回相同的日期。

所以现在我更难过了。

4

5 回答 5

4

我会这样做:

NSDate *referenceDate = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit) fromDate:referenceDate];

int targetWeekday = 4;

if (dateComponents.weekday >= targetWeekday)
{
    dateComponents.week++;
}

dateComponents.weekday = targetWeekday;
NSDate *followingTargetDay = [calendar dateFromComponents:dateComponents];
于 2012-11-02T11:34:43.983 回答
2

您必须通过 NSDateFormatter。你可以做这样的事情来计算下一个星期三。我不确定你想要什么,但这里有一个例子:

NSDate *referenceDate = [NSDate date];
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *mincomp = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:referenceDate];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"e"];
while ([[formatter stringFromDate:[cal dateFromComponents:mincomp]] intValue] != 4)
    mincomp.day += 1;
[formatter setDateFormat:@"yyyy-MM-dd"];
NSLog(@"next wednesday = %@", [formatter stringFromDate:[cal dateFromComponents:mincomp]]);
于 2012-11-02T11:35:27.673 回答
1

采用dateWithNaturalLanguageString

NSDate *date = [NSDate dateWithNaturalLanguageString:@"next Wednesday"];
NSLog(@"%@",date);

注意::dateWithNaturalLanguageString_

创建并返回一个 NSDate 对象,该对象设置为给定字符串指定的日期和时间。

+ (id)dateWithNaturalLanguageString:(NSString *)string

参数

细绳

包含日期的口语规范的字符串,例如“上周二晚餐”、“2001 年 12 月 31 日下午 3 点”、“2001 年 12 月 31 日”或“2001 年 12 月 31 日”。</p>

于 2012-11-02T11:54:43.513 回答
0

我还没有把整个事情很好地捆绑起来,因为我昨天巧合地完成的实现是在另一台计算机上,但大致是:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"e"];
NSInteger day = [[formatter stringFromDate:theDate] integerValue];
NSInteger offsetDays = (targetDay - day);  // targetDay is 4 for Wednesday
if (offsetDays < 0) offsetDays += 7;
NSDate* resultDate = [theDate dateByAddingTimeInterval:offsetDays * secondsInADay];

(offsetDays 的计算可能有点混乱——这种事情需要比早上这个时候更多的思考。)

于 2012-11-02T12:19:17.790 回答
-1

这家伙搞定了。

适用于 OP:

NSDate *refDate = [NSDate date]; // or whatever
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setLocale:[NSLocale currentLocale]];

NSDateComponents *nowComponents = [gregorian components:NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:refDate];
int wednesday = 4;
if(nowComponents.weekday >= wednesday) {
    [nowComponents setWeek: nowComponents.week + 1]; // Next week
}
[nowComponents setWeekday:wednesday]; // Wednesday
[nowComponents setHour:8]; // Specific time (if desired)
[nowComponents setMinute:0];
[nowComponents setSecond:0];

NSDate *nextWednesday = [gregorian dateFromComponents:nowComponents];

正如您所说,即使参考日期是星期三,每次都会得到“下一个星期三”。

编辑:修复了评论中指出的错误。

于 2013-07-18T17:22:30.747 回答