繁体   English   中英

struct tm-> tm_yday是否为leap年给出正确的值?

[英]Does struct tm->tm_yday give correct value for leap year?

假设我想获得自1月1日起已经过去的日子,这会返回leap年的正确值吗?

struct tm *now_tm;
struct timeval tv;
time_t currtime;

gettimeofday(&tv, NULL);
currtime=tv.tv_sec;
now_tm = localtime(&currtime);
int day = now_tm->tm_yday;

tm参考http://www.cplusplus.com/reference/ctime/tm/

是的,如果您将currtime初始化为当前时间而不是未初始化的话,它将:

time_t currtime = time(0);

最好在man localtime计算机上(当地时间)找到一个更好的参考。 或者您可以在这里阅读。

请注意,该字段记录为具有0-365(含)值,而不是0-364,因此它具有366个可能的值。

是-它将返回365。1月1日将返回0,12月31日将返回364(非le年)和365(leap年)

是的,您可以对其进行测试。 您最好使用gmtime进行此操作,因为localtime涉及时区,并且时区可以一天一天结束,并且我们不需要这种复杂性。

2000年是a年,也是棘手的一年,因此它是一个很好的考验。 2000年1月1日午夜的Unix时代是946684800(从1970年1月1日起30年+ 7个leap日)。 因此,我们将前进31天和28天,直到2月29日。 我们可以使用gmtime来获取一年中的日期,而使用asctime来验证我们具有正确的日期。

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

int main() {
    struct tm *date;
    const int secs_per_day = 24 * 60 * 60;

    /* Jan 1st, 2000 midnight UTC in Unix epoch.
       30 years since Jan 1st, 1970.
       Plus 7 leap days between Jan 1, 1970 and Jan 1, 2000.
       Feb 29th 1972, 76, 82, 86, 92, and 96
    */
    int days = (30 * 365) + 7;
    time_t time = days * secs_per_day;

    date = gmtime(&time);
    printf("%d == %s", date->tm_yday, asctime(date));

    /* Jump ahead to Feb 29th */
    time += (31 + 28) * secs_per_day;

    date = gmtime(&time);
    printf("%d == %s", date->tm_yday, asctime(date));
}

我们可以看到它起作用,2000年2月29日是一年中的第59天(从0开始算起)。

0 == Sat Jan  1 00:00:00 2000
59 == Tue Feb 29 00:00:00 2000

暂无
暂无

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

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