5

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
4

5 に答える 5

11

オフセットを使用すると簡単です:

#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;
}
于 2013-10-15T09:22:39.550 に答える
2

次のアルゴリズムを提案します。

#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;
}
于 2013-10-15T09:34:03.433 に答える