【问题标题】:How to find the day of the week `tm_wday` from a given date?如何从给定日期查找星期几`tm_wday`?
【发布时间】:2015-10-10 21:22:05
【问题描述】:

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

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;但它prints 5.
实际上tm_wday 给出了一致的结果,但相差 3 天。
这里有什么问题?

【问题讨论】:

  • 选择一种语言。 C 或 C++ 并坚持下去。得到答案后不要更改您的代码。它通常会使答案无效。
  • @SouravGhosh,我认为没有必要只坚持其中之一。 <time.h> 和 <ctime> 分别在 C 和 C++ 中可用。同时打开两个标签可以提供更好的可见性。代码没有改变,只是从代码中删除了std::,以避免有人从C中取消标记。这没有区别。
  • 您的代码位于C。那为什么要标记c++呢?

标签: c++ c time dayofweek


【解决方案1】:

你弄错了月份,tm_mon 是自一月以来的偏移量,所以七月是 6。来自手册页:

tm_mon 自一月以来的月数,范围为 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(3) 或类似名称将其他字段初始化为 0。

【讨论】:

  • 我的错。我从不在乎检查月份:-)。使用大括号初始化器,我相信其余字段将自动初始化为 0。因此不需要memset()。
【解决方案2】:

您得到无效输出的原因是您使用了错误的月份。 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

Live Example

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多