[英]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;
是的,如果您將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.