簡體   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