C++ 如何从给定日期查找一周中的某一天?

C++ 如何从给定日期查找一周中的某一天?,c++,c,time,dayofweek,C++,C,Time,Dayofweek,为了找到给定日期的日期(数字),我使用编写了以下代码: tm time {ANY_SECOND, ANY_MINUTE, ANY_HOUR, 21, 7, 2015 - 1900}; mktime(&time); // today's date PRINT(time.tm_wday); // prints 5 instead of 2 for Tuesday 根据文档,tm_wday可以在[0

为了找到给定日期的日期(数字),我使用
编写了以下代码:

tm time {ANY_SECOND, ANY_MINUTE, ANY_HOUR, 21, 7, 2015 - 1900};
mktime(&time); //                          today's date                     
PRINT(time.tm_wday);  // prints 5 instead of 2 for Tuesday
根据文档,
tm_wday
可以在
[0-6]
之间保存值,其中0是星期日。因此,对于星期二(今天),它应该打印2;但这是事实。
实际上,
tm_wday
给出了一致的结果,但相差3天。

这里怎么了?

您得到无效输出的原因是您使用了错误的月份。tm_mon从0开始,而不是1。您可以使用以下代码查看tghis:

tm time {50, 50, 12, 21, 7, 2015 - 1900};
time_t epoch = mktime(&time);
printf("%s", asctime(gmtime(&epoch)));
输出:

Fri Aug 21 12:50:50 2015

您得到无效输出的原因是您使用了错误的月份。tm_mon从0开始,而不是1。您可以使用以下代码查看tghis:

tm time {50, 50, 12, 21, 7, 2015 - 1900};
time_t epoch = mktime(&time);
printf("%s", asctime(gmtime(&epoch)));
输出:

Fri Aug 21 12:50:50 2015

你把月份搞错了,
tm\u mon
是从一月开始的偏移量,所以七月是6号。从手册页:

tm_mon自1月以来的月数,范围为0到11

这将输出
2

#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void) {
    struct tm time;
    memset(&time, 0, sizeof(time));

    time.tm_mday = 21;
    time.tm_mon = 6;
    time.tm_year = 2015-1900;

    mktime(&time);

    printf("%d\n", time.tm_wday);

    return 0;
}
#包括
#包括
#包括
内部主(空){
结构时间;
memset(&time,0,sizeof(time));
time.tm_mday=21;
time.tm_mon=6;
time.tm_年=2015-1900年;
mktime(&time);
printf(“%d\n”,time.tm\u wday);
返回0;
}

请注意,您应该使用
memset(3)
或类似工具将其他字段初始化为0。

您的月份搞错了,
tm\u mon
是自1月以来的偏移量,因此7月是6日。从手册页:

tm_mon自1月以来的月数,范围为0到11

这将输出
2

#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void) {
    struct tm time;
    memset(&time, 0, sizeof(time));

    time.tm_mday = 21;
    time.tm_mon = 6;
    time.tm_year = 2015-1900;

    mktime(&time);

    printf("%d\n", time.tm_wday);

    return 0;
}
#包括
#包括
#包括
内部主(空){
结构时间;
memset(&time,0,sizeof(time));
time.tm_mday=21;
time.tm_mon=6;
time.tm_年=2015-1900年;
mktime(&time);
printf(“%d\n”,time.tm\u wday);
返回0;
}

请注意,应使用
memset(3)
或类似工具将其他字段初始化为0。

选择一种语言。C或C++,坚持下去。得到答案后不要更改代码。这通常会使答案无效。@SouravGhosh,我认为没有必要只坚持其中的一个 <代码>和<代码> <代码>。将两个标记都打开可以提供更好的可见性。代码保持不变,只是从代码中删除了
std::
,以避免有人从C中取消标记。这没有什么区别。您的代码位于
C
中。那么为什么要标记c++?选择一种语言。C或C++,坚持下去。得到答案后不要更改代码。这通常会使答案无效。@SouravGhosh,我认为没有必要只坚持其中的一个 <代码>和<代码> <代码>。将两个标记都打开可以提供更好的可见性。代码保持不变,只是从代码中删除了
std::
,以避免有人从C中取消标记。这没有什么区别。您的代码位于
C
中。那么为什么要标记c++呢?我的错。我从不在乎检查月份:-)。使用大括号初始值设定项,我相信其余字段将自动初始化为0。因此,不需要
memset()
。我的错误。我从不在乎检查月份:-)。使用大括号初始值设定项,我相信其余字段将自动初始化为0。因此,不需要
memset()