yyyymmddhhmmss文字列からtime_tを取得する最速の方法
質問
これは合法ですか? 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_wday
と tm_yday
フィールド、および他のフィールドに基づいてそれらの新しい値を計算します。同じことがBSD拡張機能にも当てはまります tm_gmtoff
と tm_zone
, 、それらがローカルタイムゾーンから計算されることを除いて。
ただし、それに注意してください mktime()
使用します ローカル 時間、UTCではなく、入力日がUTCの場合、TimeZoneをUTCに設定する必要があります。
他のヒント
おそらく使用する方が良いでしょう getDate あなたがいない限り 承知しました 遅すぎます。そうでなければ、あなたがしていることは、少し不可解ではないにしてもかなりうまく見えます。
一般的に日付と時刻の取り扱いには多くのトリッキーなゴッチャがありますので、自分で転がるのではなく、Strptime()を強くお勧めします。 Strptime()のパフォーマンスがボトルネックである場合、より良いStrptime()を作成しようとする以外に、他の方法でそれを回避します。
あなたの文字列とTime_t(通常使用されているように)は2番目の精度のみを与えます。そのため、変換された値をキャッシュして、1秒あたり1回だけ更新できます。
そもそも、文字列形のタイムスタンプを使用しないでください。たとえば、time_t値(時代()で返されたエポックから数秒を含む)を代わりに渡し、それを印刷/[ユーザー/に表示する必要がある場合//shows show shuldにsoverに変換します。