質問

これは合法ですか? yyyymmddhhmmssのようにフォーマットされた文字列を考えると、できるだけ速くtime_tに到達しようとしています。

static time_t ConvertToSecSince1970(char *szYYYYMMDDHHMMSS)
{
struct tm    Tm;    

    memset(&Tm, 0, sizeof(Tm));
    Tm.tm_year = makeInt(szYYYYMMDDHHMMSS +  0, 4) - 1900;
    Tm.tm_mon  = makeInt(szYYYYMMDDHHMMSS +  4, 2) - 1;
    Tm.tm_mday = makeInt(szYYYYMMDDHHMMSS +  6, 2);
    Tm.tm_hour = makeInt(szYYYYMMDDHHMMSS +  8, 2);
    Tm.tm_min  = makeInt(szYYYYMMDDHHMMSS + 10, 2);
    Tm.tm_sec  = makeInt(szYYYYMMDDHHMMSS + 12, 2);
    return mktime(&Tm);
}

以下を使用してTMを作成した場合、同じ答えを作成するようです。

strptime(szYYYYMMDDHHMMSS, "%Y%m%d%H%M%S", &Tm);

TM_YDAY、TM_WDAY、TM_ISDST、TM_GMTOFF、TM_ZONEが重要であることを心配しています。私の日付はUTCなので、gmtoff = 0とtm_zone = 0が機能する可能性があると考えました。

ちなみに、ここにmakeintがあります:

inline int makeInt(const char *p, int size)
{
    const char *endp;
    int intval = 0;

    endp = p + size;
    while (p < endp)
    {
        intval = intval * 10 + *p - '0';
        p++;
    }
    return intval;
}
役に立ちましたか?

解決

mktime() 無視します tm_wdaytm_yday フィールド、および他のフィールドに基づいてそれらの新しい値を計算します。同じことがBSD拡張機能にも当てはまります tm_gmtofftm_zone, 、それらがローカルタイムゾーンから計算されることを除いて。

ただし、それに注意してください mktime() 使用します ローカル 時間、UTCではなく、入力日がUTCの場合、TimeZoneをUTCに設定する必要があります。

他のヒント

おそらく使用する方が良いでしょう getDate あなたがいない限り 承知しました 遅すぎます。そうでなければ、あなたがしていることは、少し不可解ではないにしてもかなりうまく見えます。

一般的に日付と時刻の取り扱いには多くのトリッキーなゴッチャがありますので、自分で転がるのではなく、Strptime()を強くお勧めします。 Strptime()のパフォーマンスがボトルネックである場合、より良いStrptime()を作成しようとする以外に、他の方法でそれを回避します。

  1. あなたの文字列とTime_t(通常使用されているように)は2番目の精度のみを与えます。そのため、変換された値をキャッシュして、1秒あたり1回だけ更新できます。

  2. そもそも、文字列形のタイムスタンプを使用しないでください。たとえば、time_t値(時代()で返されたエポックから数秒を含む)を代わりに渡し、それを印刷/[ユーザー/に表示する必要がある場合//shows show shuldにsoverに変換します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top