c++ - C++ 制作 week_of_year() 函数不确定如何执行此操作
问题描述
所以我有一些日期类,我想创建一个函数来返回某个日期在一年中的多少周,但就像在考虑了一下之后我刚刚做了我认为在技术上可行的?
int week_of_year(const Date& d)
{
int week = (int(d.month()) - 1) * 5 + ceil(d.day() / 7.0); //50
return week;
}
因此,我只需将 5 乘以当前月份以下的一个月,然后将日期除以一周并四舍五入,这似乎可行,但似乎我只是采取了简单的方法,也不是最聪明的方法,任何人都这样做否则对我如何做这样的事情有任何想法吗?
我还为此查找了一个解决方案,因为它来自某本书的练习,我发现了这个:
Date day_one(const Date& d)
{
int year = d.year();
const int earliest_first_day = 26;
if (d.month() == Month::dec && d.day() >= earliest_first_day) {
if (int(day_of_week(d)) <= (d.day() - earliest_first_day))
++year;
}
Date d1 {year, Month::jan, 1};
while (day_of_week(d1) != Day::sun)
d1.add_day(-1);
return d1;
}
// Ex 11
int week_of_year(const Date& d)
{
Date iter{day_one(d)};
if (iter == d)
return 1;
int week = 0;
while (iter < d) {
iter.add_day(7);
++week;
}
return week;
}
但老实说,我什至不确定这里发生了什么.. 编辑:日期类
enum class Day
{
sun=0, mon, tues, wed, thurs, fri, sat
};
enum class Month {
jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
};
class Date {
int y;
Month m;
int d;
public:
Date(int y, Month m, int d);
void add_day(int n);
int year() const { return y; }
Month month() const { return m; }
int day() const { return d; }
};
解决方案
实现此目的的一种方法是使用mktime
.
tm tms;
memset(&tms, '\0', sizeof(tms));
tms.tm_year = d.year() - 1900;
tms.tm_mon = d.month() - 1;
tms.tm_mday = d.day();
tms.tm_sec = 1;
tms.tm_isdst = -1;
if (mktime(&tms) == -1) throw some_error;
auto days_into_year = tms.tm_yday + 1;
return days_into_year / 7 + !!(days_into_year % 7);
您必须根据一年中第一周的实际含义(即第 0 周或第 1 周)来调整代码。
推荐阅读
- spring - 在测试期间无法禁用 spring claud 配置
- ios - 如果同一个应用程序已上传到网站以先使用 Enterprise 下载,然后再上传到应用程序商店,iOS 应用程序冲突?
- sql - 在 SQL Server 中使用逐行总和进行数据透视
- php - 如何使用 picqer/exact-php-client 从exactonline 下载发票pdf
- java - 当我对字符串使用 split 方法时,为什么在我的字符串数组列表中添加了一个额外的空间
- swift - SwiftUI:防止长词断字
- java - RestTemplate 项目:DTO 字段自行更改
- java - 即使一切正确,Jackson Streaming API 也会抛出“无法写入字段名称,期待值”错误
- python - 为什么在请求 API 调用中使用 verify=True?
- tensorflow - 保存客户端联合数据集的正确方法