我试图获得今年第一个星期天的日期
int getFristSunday () {
time_t rawtime;
struct tm * timeinfo;
time( &rawtime );
timeinfo = localtime( &rawtime );
timeinfo->tm_mon = 0;
timeinfo->tm_wday = 0;
mktime( timeinfo );
return timeinfo->tm_yday ;
}
但是我得到了第一个星期四
答案 0 :(得分:1)
使用此free, open-source, header-only C++11/14 library:
#include "date.h"
#include <iostream>
int
main()
{
using namespace date;
std::cout << year_month_day{sun[1]/jan/2016} << '\n';
}
输出:
2016-01-03
year()
对象有month()
,day()
和year_month_day
个访问者。并且算法经过高度优化(不包含迭代循环)。
如果您希望编写自己的日期计算,请在上述日期库中使用here are the public domain calendrical algorithms。该链接直接指向描述如何查找月/年组合的第N天的部分。
答案 1 :(得分:0)
time-&gt; tm_wday和time-&gt; tm_yday将被忽略。
您必须将timeinfo->tm_mday
设置为1
,然后在调用mktime
后检查它是哪一天,并从那里开始向前计数。
答案 2 :(得分:0)
在致电mktime()
所有字段之前,需要设置tm_yday
和tm_wday
除外。显然,我们需要为1月1日设置tm_mon
和tm_mday
。
重要的是将tm_hour
设置为正午(12)和/或tm_isdst
设置为-1,以确保重新计算的时间不受夏令时影响。考虑如果当前时间接近午夜会发生什么,现在的DST设置与1月1不同。重新计算可能会推迟1月1日到1月2日或12月31日。
int getFirstSunday(void) {
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
timeinfo->tm_mon = 0; // set to January which is 0 "Months since January"
timeinfo->tm_mday = 1; // Set to the 1st of the month
timeinfo->tm_hour = 12; // Set to avoid getting the wrong DST setting for Jan 1.
timeinfo->tm_isdst = -1; // Set to avoid getting the wrong DST setting for Jan 1.
if (mktime(timeinfo) == -1) return -1;
int DaysSinceSundayForJan1 = timeinfo->tm_wday; // days since Sunday — [0, 6]
int DaysAfterJan1toNextSunday = 7 - DaysSinceSundayForJan1;
int DaysAfterJan1toFirstSunday = DaysAfterJan1toNextSunday%7;
// Convert to "day of the month"
return DaysAfterJan1toFirstSunday + 1;
}