5

私は C で 2 つの単純なコンバーター、日付/時刻からタイムスタンプへ、およびその逆を実装しようとしています。時刻ライブラリ ルーチン (localtime、mktime など、主にそれらの一部がスレッドであるという事実による) への依存はありません。 -安全でない)。

以前に日付/時刻をタイムスタンプに変換する、またはその逆に同様の質問を投稿しましたが、いくつかの注目すべき変更を加えて再度送信したいと思います。

次の日付/時刻構造があります。

typedef struct
{
    unsigned char second; // 0-59
    unsigned char minute; // 0-59
    unsigned char hour;   // 0-59
    unsigned char day;    // 1-31
    unsigned char month;  // 1-12
    unsigned char year;   // 0-99 (representing 2000-2099)
}
date_time_t;

次の変換ルーチンについてセカンドオピニオンを持ちたいと思います (法的な情報が与えられた場合)。

static unsigned short days[4][12] =
{
    {   0,  31,  60,  91, 121, 152, 182, 213, 244, 274, 305, 335},
    { 366, 397, 425, 456, 486, 517, 547, 578, 609, 639, 670, 700},
    { 731, 762, 790, 821, 851, 882, 912, 943, 974,1004,1035,1065},
    {1096,1127,1155,1186,1216,1247,1277,1308,1339,1369,1400,1430},
};


unsigned int date_time_to_epoch(date_time_t* date_time)
{
    unsigned int second = date_time->second;  // 0-59
    unsigned int minute = date_time->minute;  // 0-59
    unsigned int hour   = date_time->hour;    // 0-23
    unsigned int day    = date_time->day-1;   // 0-30
    unsigned int month  = date_time->month-1; // 0-11
    unsigned int year   = date_time->year;    // 0-99
    return (((year/4*(365*4+1)+days[year%4][month]+day)*24+hour)*60+minute)*60+second;
}


void epoch_to_date_time(date_time_t* date_time,unsigned int epoch)
{
    date_time->second = epoch%60; epoch /= 60;
    date_time->minute = epoch%60; epoch /= 60;
    date_time->hour   = epoch%24; epoch /= 24;

    unsigned int years = epoch/(365*4+1)*4; epoch %= 365*4+1;

    unsigned int year;
    for (year=3; year>0; year--)
    {
        if (epoch >= days[year][0])
            break;
    }

    unsigned int month;
    for (month=11; month>0; month--)
    {
        if (epoch >= days[year][month])
            break;
    }

    date_time->year  = years+year;
    date_time->month = month+1;
    date_time->day   = epoch-days[year][month]+1;
}

私はこれを大量の合法的な入力 (2000 年 1 月 1 日から 2099 年 12 月 31 日まで) でテストしました。建設的なコメントをいただければ幸いです (パフォーマンス改善の提案、読みやすさなど)...

更新-ここでの私の最終的な目標(この質問を投稿しているため):

私は STM32 (ARM ベースの Cortex) を持っており、タイマーは 10ms ごとに CPU に割り込むように設定されています。さらに、RTC が接続されており、そこから日付/時刻を (1 秒単位で) 読み取ることができます。RTC へのアクセスは効率が悪いので、一度だけ読み込んで、それ以降は 10ms のタイマー割り込みを使用して日付/時刻を計算します。ミューテックスで保護する必要があるため、「localtime」の使用は避けたいと思います。頭に浮かぶ唯一の解決策は、独自の「localtime」を実装し、その後の結果として独自の「mktime」も実装することです (上記のコードのエポックは、2000 年の初めからの秒数をカウントします)。

4

1 に答える 1