计算 C99 中两个日期字符串之间的工作日数
count number of weekdays between two date strings in C99
我有两个 yyyy-mm-dd 形式的日期字符串,就像
const char* date_start = "2015-09-30";
const char* date_end = "2015-10-03";
如何计算两个日期之间的工作日天数(既不是周六也不是周日的天数)?可以存在开始和结束日期相等的日期(那么天数应该等于 1(工作日)或 0(周末))。所有输入的日期都保证有效(例如,不是 2 月 30 日)。
该解决方案需要在 OS X 和 Windows 上与 C99 一起工作,并且独立于系统区域设置。
我希望尽可能少地使用外部代码(即库或框架)。
伪代码
形成时间结构
struct tm start = {0};
start.tm_year = 2105-1900;
start.tm_mon = 9-1;
start.tm_mday = 30;
start.tm_isdst = 0;
struct tm end = ...
形成时间编号并设置tm_wday字段
time_t tstart = mktime(&start);
time_t tend = mktime(&end);
求日差
double day_diff = difftime(&tend, &tstart)/(24.0*60*60);
每个工作日都有一些魔法(留给 OP)
numweekdays = ((long)day_diff/7)*5 + foo(start->tm_wday, end->tm_wday);
- 将日期字符串转换为更易于处理的内容,例如 "long date since 1.1.1970",如果这适合您的用例;或 "struct tm"
- 计算天数差(结束减开始加一)
- 对于差异内的每个完整周 (> 7) 添加 5 weekdays/2 个周末
- 计算其余(至少 6)天的工作日状态并相应地添加它们
我有两个 yyyy-mm-dd 形式的日期字符串,就像
const char* date_start = "2015-09-30";
const char* date_end = "2015-10-03";
如何计算两个日期之间的工作日天数(既不是周六也不是周日的天数)?可以存在开始和结束日期相等的日期(那么天数应该等于 1(工作日)或 0(周末))。所有输入的日期都保证有效(例如,不是 2 月 30 日)。
该解决方案需要在 OS X 和 Windows 上与 C99 一起工作,并且独立于系统区域设置。
我希望尽可能少地使用外部代码(即库或框架)。
伪代码
形成时间结构
struct tm start = {0};
start.tm_year = 2105-1900;
start.tm_mon = 9-1;
start.tm_mday = 30;
start.tm_isdst = 0;
struct tm end = ...
形成时间编号并设置tm_wday字段
time_t tstart = mktime(&start);
time_t tend = mktime(&end);
求日差
double day_diff = difftime(&tend, &tstart)/(24.0*60*60);
每个工作日都有一些魔法(留给 OP)
numweekdays = ((long)day_diff/7)*5 + foo(start->tm_wday, end->tm_wday);
- 将日期字符串转换为更易于处理的内容,例如 "long date since 1.1.1970",如果这适合您的用例;或 "struct tm"
- 计算天数差(结束减开始加一)
- 对于差异内的每个完整周 (> 7) 添加 5 weekdays/2 个周末
- 计算其余(至少 6)天的工作日状态并相应地添加它们