繁体   English   中英

我的日期代码有问题吗?

[英]Is there something wrong with my date code?

说明:给定START_GREGORIAN_CALENDAR之后的日期,此函数返回到下一个星期四的天数。 例如,对于2011年3月16日(2011,3,16),该函数将返回1;对于2011年3月17日(2011,3,17),该函数将返回7。

int daysToNextThursday (int year, int month, int day) {
    int Thursday;
    Thursday = 7;
    return (Thursday - day);   
}

代码可以正确编译,但是当我输入日期(例如16 3 2011)时,我没有得到正确的答案。 请注意,这是我编写的大量代码中的一部分,它们可以完美地工作。

有任何想法吗?

是的,我有个主意。 我的想法是,您回头重新考虑为确定一天是星期四而选择的算法。 这是完全错误的:-)

现在,就像每天两次正确的时钟中断一样,您可能会找到可以提供正确答案的输入参数,但它们将是例外,而不是规则。

如果您想确定下一个星期四是从给定日期算起的时间,C会提供恰好用于此目的的日期和时间函数:

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

static char *textday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

int main (int argc, char *argv[]) {
    int year, month, day, today, thursday;
    struct tm *mytm;
    time_t mytime;

    // Get all arguments (minimal error checks).

    if (argc != 3) {
        printf ("Usage: next_thursday <year> <month>\n");
        return -1;
    }
    year = atoi (argv[1]);
    month = atoi (argv[2]);

    // Do first fourteen days of the month.

    for (day = 1; day <= 14; day++) {

直到那里,它只是获取参数并开始循环。 计算的内容如下,设置了有用的struct tm ,然后将我们的年月日强制加入其中。 然后, mktime将为我们填写tm_wday (星期几)字段,我们可以用它来计算到星期四的天数。

        // Make the tm structure based on date (and midday).

        mytime = time (0);
        mytm = localtime (&mytime);
        mytm->tm_year = year - 1900;
        mytm->tm_mon = month - 1;
        mytm->tm_mday = day;
        mytm->tm_hour = 12;
        mytime = mktime (mytm);

        // Output filled in fields and days till next Thursday.

        today = mytm->tm_wday;
        thursday = (11 - today) % 7;
        if (thursday == 0)
            thursday = 7;
        printf ("%04d-%02d-%02d, weekday = %d (%s), days till Thu = %d\n",
            mytm->tm_year + 1900, mytm->tm_mon + 1, mytm->tm_mday,
            today, textday[today], thursday);
    }

    return 0;
}

请注意, thursday计算有些麻烦,它只是根据下表提供给我们的天数:

 today   thursday
-------  --------
0 (sun)      4
1 (mon)      3
2 (tue)      2
3 (wed)      1
4 (thu)      7
5 (fri)      6
6 (sat)      5

如果您想要一个更具可读性的解决方案,则可以使用:

if (today < 4) thursday = 4 - today;
else           thursday = 11 - today;

该程序在2011-03输出以下内容:

2011-03-01, weekday = 2 (Tue), days till Thu = 2
2011-03-02, weekday = 3 (Wed), days till Thu = 1
2011-03-03, weekday = 4 (Thu), days till Thu = 7
2011-03-04, weekday = 5 (Fri), days till Thu = 6
2011-03-05, weekday = 6 (Sat), days till Thu = 5
2011-03-06, weekday = 0 (Sun), days till Thu = 4
2011-03-07, weekday = 1 (Mon), days till Thu = 3
2011-03-08, weekday = 2 (Tue), days till Thu = 2
2011-03-09, weekday = 3 (Wed), days till Thu = 1
2011-03-10, weekday = 4 (Thu), days till Thu = 7
2011-03-11, weekday = 5 (Fri), days till Thu = 6
2011-03-12, weekday = 6 (Sat), days till Thu = 5
2011-03-13, weekday = 0 (Sun), days till Thu = 4
2011-03-14, weekday = 1 (Mon), days till Thu = 3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM