- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个与在 Objective-C 中计算工作日相关的问题。
我需要将 X
个工作日添加到给定的 NSDate
。
例如,如果我有一个日期:2010 年 10 月 22 日,星期五,然后添加 2 个工作日,我应该得到:26 日星期二- 2010 年 10 月。
提前致谢。
最佳答案
这有两个部分:
我将从另外两个帖子中提取信息来帮助我。
对于周末,我需要知道给定日期是星期几。为此,这篇文章派上用场了: How to check what day of the week it is (i.e. Tues, Fri?) and compare two NSDates?
对于假期,@vikingosegundo 在这篇文章中有一个非常好的建议: List of all American holidays as NSDates
首先,让我们处理周末;
我已经将我上面引用的帖子中的建议总结到这个漂亮的小助手函数中,它告诉我们日期是否是工作日:
BOOL isWeekday(NSDate * date)
{
int day = [[[NSCalendar currentCalendar] components:NSWeekdayCalendarUnit fromDate:date] weekday];
const int kSunday = 1;
const int kSaturday = 7;
BOOL isWeekdayResult = day != kSunday && day != kSaturday;
return isWeekdayResult;
}
我们需要一种方法将日期增加给定的天数:
NSDate * addDaysToDate(NSDate * date, int days)
{
NSDateComponents * components = [[NSDateComponents alloc] init];
[components setDay:days];
NSDate * result = [[NSCalendar currentCalendar] dateByAddingComponents:components toDate:date options:0];
[components release];
return result;
}
我们需要一种跳过周末的方法:
NSDate * ensureDateIsWeekday(NSDate * date)
{
while (!isWeekday(date))
{
// Add one day to the date:
date = addDaysToDate(date, 1);
}
return date;
}
我们需要一种方法来为日期添加任意天数:
NSDate * addBusinessDaysToDate(NSDate * start, int daysToAdvance)
{
NSDate * end = start;
for (int i = 0; i < daysToAdvance; i++)
{
// If the current date is a weekend, advance:
end = ensureDateIsWeekday(end);
// And move the date forward by one day:
end = addDaysToDate(end, 1);
}
// Finally, make sure we didn't end on a weekend:
end = ensureDateIsWeekday(end);
return end;
}
现在让我们把它联系起来,看看到目前为止我们有什么:
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSDate * start = [NSDate date];
int daysToAdvance = 10;
NSDate * end = addBusinessDaysToDate(start, daysToAdvance);
NSLog(@"Result: %@", [end descriptionWithCalendarFormat:@"%Y-%m-%d"
timeZone:nil
locale:nil]);
[pool drain];
return 0;
}
所以,我们已经有周末了,现在我们需要把假期拉回来。
引入一些 RSS 提要或来自其他来源的数据绝对超出了我的帖子范围...因此,我们假设您知道某些日期是假期,或者根据您的工作日历,是休息日.
现在,我将使用 NSArray 来执行此操作...但是,同样,这也留下了很大的改进空间 - 至少应该对它进行排序。更好的是,某种用于快速查找日期的哈希集。但是,这个例子应该足以解释这个概念。 (这里构造了一个数组,表示从现在开始两三天后有假期)
NSMutableArray * holidays = [[NSMutableArray alloc] init];
[holidays addObject:addDaysToDate(start, 2)];
[holidays addObject:addDaysToDate(start, 3)];
而且,这方面的实现将与周末非常相似。我们会确保这一天不是假期。如果是,我们将提前到第二天。因此,一组方法可以帮助解决这个问题:
BOOL isHoliday(NSDate * date, NSArray * holidays)
{
BOOL isHolidayResult = NO;
const unsigned kUnits = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents * components = [[NSCalendar currentCalendar] components:kUnits fromDate:date];
for (int i = 0; i < [holidays count]; i++)
{
NSDate * holiday = [holidays objectAtIndex:i];
NSDateComponents * holidayDateComponents = [[NSCalendar currentCalendar] components:kUnits fromDate:holiday];
if ([components year] == [holidayDateComponents year]
&& [components month] == [holidayDateComponents month]
&& [components day] == [holidayDateComponents day])
{
isHolidayResult = YES;
break;
}
}
return isHolidayResult;
}
和:
NSDate * ensureDateIsntHoliday(NSDate * date, NSArray * holidays)
{
while (isHoliday(date, holidays))
{
// Add one day to the date:
date = addDaysToDate(date, 1);
}
return date;
}
最后,对我们的加法函数进行一些修改以考虑假期:
NSDate * addBusinessDaysToDate(NSDate * start, int daysToAdvance, NSArray * holidays)
{
NSDate * end = start;
for (int i = 0; i < daysToAdvance; i++)
{
// If the current date is a weekend, advance:
end = ensureDateIsWeekday(end);
// If the current date is a holiday, advance:
end = ensureDateIsntHoliday(end, holidays);
// And move the date forward by one day:
end = addDaysToDate(end, 1);
}
// Finally, make sure we didn't end on a weekend or a holiday:
end = ensureDateIsWeekday(end);
end = ensureDateIsntHoliday(end, holidays);
return end;
}
继续尝试:
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSDate * start = [NSDate date];
int daysToAdvance = 10;
NSMutableArray * holidays = [[NSMutableArray alloc] init];
[holidays addObject:addDaysToDate(start, 2)];
[holidays addObject:addDaysToDate(start, 3)];
NSDate * end = addBusinessDaysToDate(start, daysToAdvance, holidays);
[holidays release];
NSLog(@"Result: %@", [end descriptionWithCalendarFormat:@"%Y-%m-%d"
timeZone:nil
locale:nil]);
[pool drain];
return 0;
}
如果你想要整个项目,这里是:http://snipt.org/xolnl
关于objective-c - 我如何将工作日添加到 NSDate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7871435/
我正在尝试创建一个脚本,该脚本在设定的时间段(上个月的 23 日和本月的 23 日)内获取工作日、日历日和工作日的计数。 我有以下脚本,我尝试使用 Worksheet Functions 但它不起作用
如何将 xts 对象子集以仅包含工作日(周一至周五,周六和周日除外)? 最佳答案 这是我要做的: library(xts) data(sample_matrix) sample.xts <- as.x
我一直在尝试计算在特定工作日内创建了多少个值没有成功: SELECT count(*) as count FROM packets WHERE strftime("%w", timeIn) = '1'
我正在编写一个脚本,它只在周一至周五上午 8 点至下午 5 点期间运行。问题是在它脱离 8-5 或 M-F while() 循环之后,它只是......不知道如何回到循环中。这让我觉得我可能以错误的角
我想得到上一季度的最后一个工作日(工作日),比如 2019.03.31 是星期天,所以我的要求是得到 2019.03.29 的输出。 我写了下面的代码,它工作得很好但看起来不整洁,在我看来 kdb 有
我想知道我在这个网格中选择日期时的工作日。我尝试了有效的 JavaScript 代码,但在 C# 中使用它时遇到了一些困难。 string startdate, enddate;
如标题所示,我正在为我的应用程序寻找解决方案,包括在工作日添加开放和关闭时间。 图像我的应用程序: View list days of the week View after selecting th
SELECT * FROM (`users`) JOIN `artistprofiles` AS art ON `art`.`user_id` = `users`.`id` WHE
我需要将这个函数翻译成swift。基本上它得到了本周的“n”日是什么。因此,例如,如果我将它与 NSDate().getWeekDay(0) 一起使用,它会给我 9 月 11 日星期日,依此类推。但似
我是工作日 SOAP API 的新手,我正在尝试弄清楚如何发送 SOAP 请求以使用 SOAPUI 进行身份验证。 任何建议将不胜感激。 最佳答案 Workday API 使用 WS-Security
我面临以下问题:我必须将当前日期与给定工作日和时间的特定时间点进行比较,如下所示: const myObj = { "weekday": "Tuesday", "timeOfDay": "10
我之前已经发布过相关内容,这有助于我获得以下 SQL: SELECT fname, MONTH( eventDate ) , IF( WEEKDAY( eventDate ) = 5,1,0)) A
尝试使用 moment.js 获得第二个星期四(例如)。本周四不。下一个。 2 个星期四内的日期。 我已经尝试过 moment().add(1, 'week').day(4) 仅获取下周的星期四(仅当
现在是 2017 年 10 月 8 日,星期日。 var weekday = Calendar(identifier: .iso8601).component(.weekday, from: Date
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
我们使用以下规则来标记延迟 2 天或更长时间的工作项: Changed Date , > , = , [Field], >[Field], =[Field], <=[Field], In, No
我有平日 jQuery UI 选项卡,如下所示,我想在当前工作日打开它们: Monday Tuesday Wednesday Thursday Friday
我想找到一周中某一天到一周中另一天的相对距离。假设以下 R 输入是从第 0 天开始的相对差异(以天为单位): day pmin( day %% 7, rev(day)%%7) [1] 0 1 2
我一直在寻找下个月第一,第二,第三或第四工作日(工作日)的日期。 我有以下代码: NSTimeInterval *lastDue; // unix time stamp from last due d
有一个 pandas 数据框 df,为了从日期列中获取工作日,我做了: df_raw['DayOfWeek'] = df_raw[str_date_colname].dt.strftime('%w')
我是一名优秀的程序员,十分优秀!