如何在c ++中获得一年中的第一个星期天?

时间:2016-02-07 11:13:45

标签: c++ time struct mktime ctime

我试图获得今年第一个星期天的日期

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 ;
}

但是我得到了第一个星期四

Result

3 个答案:

答案 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)

来自this mktime reference

  

time-&gt; tm_wday和time-&gt; tm_yday将被忽略。

您必须将timeinfo->tm_mday设置为1,然后在调用mktime后检查它是哪一天,并从那里开始向前计数。

答案 2 :(得分:0)

在致电mktime()所有字段之前,需要设置tm_ydaytm_wday除外。显然,我们需要为1月1日设置tm_montm_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;
}