3

日時文字列を構造strptimeに解析するために使用します。tmしかし、私は問題に直面しました:

私はこの形式の日付を持っています:

Thu Dec 13 23:44:45 MSK 2012

フォーマット文字列で解析Thu Dec 13 23:44:45します。"%a %b %d %T"しかし、年の解析方法がわかりません。"%a %b %d %T MSK %Y"ロケールに依存しないパーサーが必要なため、使用することはできません。

MSK単語をスキップできますか?または問題を解決する他の方法はありますか?

4

1 に答える 1

3

答えが見つからなかったので、独自の日時パーサーを作成しました。

time_t timeParse(const char *string, struct tm *datetime)
{
    char dn[4], mn[4], ln[4];
    int d, h, m, s, y;
    sscanf(string, "%s %s %d %d:%d:%d %s %d", dn, mn, &d, &h, &m, &s, ln, &y);
    datetime->tm_sec = s;
    datetime->tm_min = m;
    datetime->tm_hour = h;
    datetime->tm_mday = d;
    if (!strcmp(mn, "Jan")) datetime->tm_mon = 0;
    if (!strcmp(mn, "Feb")) datetime->tm_mon = 1;
    if (!strcmp(mn, "Mar")) datetime->tm_mon = 2;
    if (!strcmp(mn, "Apr")) datetime->tm_mon = 3;
    if (!strcmp(mn, "May")) datetime->tm_mon = 4;
    if (!strcmp(mn, "Jun")) datetime->tm_mon = 5;
    if (!strcmp(mn, "Jul")) datetime->tm_mon = 6;
    if (!strcmp(mn, "Aug")) datetime->tm_mon = 7;
    if (!strcmp(mn, "Sep")) datetime->tm_mon = 8;
    if (!strcmp(mn, "Oct")) datetime->tm_mon = 9;
    if (!strcmp(mn, "Nov")) datetime->tm_mon = 10;
    if (!strcmp(mn, "Dec")) datetime->tm_mon = 11;
    datetime->tm_year = y - 1900;
    return mktime(datetime);
}

必要なtm structureフィールドに手動で入力し、mktime残りのフィールドに入力します: tm_wdaytm_ydaytm_isdst.

次のように呼び出す必要があります。

time_t t = timeParse("Thu Dec 13 23:44:45 MSK 2012", &datetime);
于 2012-12-17T08:48:33.043 に答える