我想将日期为2013年1月31日的日期转换为年中的日期(本例中为31日)。 此日期来自用户输入,因此我还需要检查它是否是有效日期。 我知道我可以自己计算一年中的一天,如下所示:
int get_yday(int mon, int day, int year)
{
int yday=0;
mon--;
switch (mon){
case 12:
yday+=31;
case 11:
yday+=30;
....
case 2:
if (is_leap_year(year)) yday+=29;
else yday+=28;
.....
然而,这意味着我需要自己检查用户输入,如
switch(month){
case 1:
if (day > 31 || day < 0) {...}
case 2:
if (...check leap year and day ...) {...}
C中是否有内置API可以轻松获得一年中的某一天?
下面我有一个解决方案,但我想知道是否有更好的解决方案:
1. creating a tm struct of 01/31/2013 00:00:00
2. get timestamp by mktime()
3. convert timestamp to struct tm by localtime()
4. get tm_yday from tm struct
答案 0 :(得分:7)
使用抵消很容易:
#include <stdio.h>
int yisleap(int year)
{
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int get_yday(int mon, int day, int year)
{
static const int days[2][13] = {
{0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334},
{0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}
};
int leap = yisleap(year);
return days[leap][mon] + day;
}
int main(void)
{
int day = get_yday(1, 31, 2013);
printf("%d\n", day);
return 0;
}
答案 1 :(得分:1)
我提出以下算法:
#include <stdio.h>
int leap(int y)
{
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
int main() {
int year=1992;
int month=12;
int day=1;
int mo[12] = {31,28+leap(year),31,30,31,30,31,31,30,31,30,31};
int i;
int dofy=0; // EDIT
for (i=0; i<(month-1); i++) {
dofy += mo[i];
}
dofy += day;
printf("%d\n", dofy);
return 0;
}
答案 2 :(得分:1)
您提出的解决方案很好,除非您可以省略第3步,因为mktime()
将为您修改结构,除了检查mktime()
的返回值之外,没有理由使用时间戳。在调用tm_isdst
之前,请务必正确设置struct tm
的{{1}}成员(通常为-1,除非您确定)。
答案 3 :(得分:0)
int adate[3]
int main(int argc, char *argv[])
{
adate[0]=04;
adate[1]=26;
adate[2]=2011;
int nod=dayofyear(adate);
printf("%d",nod);
return 0;
}
int dayofyear( int *date)
{
int index;
int leap;
int day;
leap = ( date[YEAR]%4 == 0 && date[YEAR]%100 != 0 || date[YEAR]%400 == 0 );
#ifdef DEBUG
fprintf( stderr, "dayofyear: year = %d, leap = %d\n", date[YEAR], leap );
#endif
day = date[DATE];
for( index = 1; index < date[MONTH]; index++ )
day += mon[leap][index];
return( day );
}