【问题标题】:How to get first day of the week from given parameters and print the whole week from monday to sunday?如何从给定参数获取一周的第一天并打印从星期一到星期日的整个星期?
【发布时间】:2017-09-28 21:19:53
【问题描述】:

我正在开发一个函数,我从用户那里获取参数,找出那一周的第一天是什么,然后将整个星期打印给用户。

这是我到目前为止所做的:

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

void week(int day, int month, int year)
{
struct tm time;
char buffer[80];
int i;

time.tm_year = year - 1900;
time.tm_mon = month - 1;
time.tm_mday = day;
time_t rightTime = mktime(&time);
time.tm_wday = rightTime;

time.tm_wday = mktime(&time);

for (i = 0; i < 7; i++)
{
    strftime(buffer, sizeof(buffer), "%A %d. %B %Y\n",&time);
    printf(buffer);

    time.tm_mday = time.tm_mday + 1;
    time.tm_wday = time.tm_wday + 1;
}    

}

然后我开始尝试使用代码来获取一周的第一天。我试图通过确定它是哪个工作日来获得一周的第一天,然后减去直到日期为星期一的所有天数。然后我可以从周一到周日开始向用户打印整个星期。 例如,如果 wday 是星期六(6):

if(rightTime == 6)
{
    time.tm_mday = time.tm_mday - 6;
}
time.tm_wday = mktime(&time);

感觉仍然不正确,但我不知道如何找出给定一周的第一天,刷新所有信息,然后为用户打印出来。

如果日、月和年的参数例如为 20 4 2017,则输出正确:

Monday 17. April 2017
Tuesday 18. April 2017
Wednesday 19. April 2017
Thursday 20. April 2017
Friday 21. April 2017
Saturday 22. April 2017
Sunday 23. April 2017

感谢所有帮助!

【问题讨论】:

  • 请不要养成将变量作为格式字符串传递的习惯——改用printf("%s", buffer)——这会在某一天拯救你的皮肤。 (在这种情况下,您可以从字符串中删除换行符,只需 puts(buffer) 这也是安全的,并且可能更有效。)

标签: c date datetime time


【解决方案1】:

mktime() 使用struct tm 中的许多成员,因此在不设置这些成员的情况下调用mktime() 会导致未定义的行为 (UB)。

// struct tm time;
struct tm time = { 0 };  // set all fields to 0.
...    
time.tm_year = year - 1900;
time.tm_mon = month - 1;
time.tm_mday = day;
time_t rightTime = mktime(&time);

mktime() 之后,设置了星期几成员。

int days_since_Sunday = time.tm_wday; // 0 - 6

...如何找出给定一周的第一天,刷新所有信息,然后为用户打印出来。 ... 从星期一到星期日将整个星期打印给用户。

要查找自星期一以来的天数,请减 1,但使用模数学并避免负数。 % 的经典功能与正参数匹配,但 differs 与负参数匹配。

#define DaysPerWeek 7
int days_since_Monday = (days_since_Sunday + DaysPerWeek - 1) % DaysPerWeek;

要打印星期,请从给定日期开始并减去偏移量:

// Move date back to Monday
time.tm_mday -= days_since_Monday;

for (int d=0; d<DaysPerWeek; d++) {
  mktime(&time); // adjust for end of month, year issues.
  strftime(buffer, sizeof buffer, "%A %d. %B %Y\n", &time);
  printf("%s", buffer);
  time.tm_mday++; // advance to tomorrow
}

注意:在struct tm time 中使用time 是可以的,但考虑到标准函数time() 会有点混乱。考虑使用不同的名称。也许struct tm timestamp_ymd

健壮的代码会增加错误检查:

if (mktime(&time) == (time_t)-1) Handle_Error();

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2012-11-27
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多