计算 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);
  1. 将日期字符串转换为更易于处理的内容,例如 "long date since 1.1.1970",如果这适合您的用例;或 "struct tm"
  2. 计算天数差(结束减开始加一)
  3. 对于差异内的每个完整周 (> 7) 添加 5 weekdays/2 个周末
  4. 计算其余(至少 6)天的工作日状态并相应地添加它们