2009-06-16 9 views
17

シナリオは次のとおりです:私はlibexifで "YYYY-MM-DD HH:MM:SS"の形式でdatetimeを取得します。節約コストを最小限に抑えるために、datetimeをUNIXのタイムスタンプまたは64ビットまたは32ビットのコストに変換する必要があります。 cとの明示的な方法はありますか?cでdatetimeをunixタイムスタンプに変換するには?

mktime

答えて

30

あなたはここにstrptimemktime

struct tm tm; 
time_t epoch; 
if (strptime(timestamp, "%Y-%m-%d %H:%M:%S", &tm) != NULL) 
    epoch = mktime(&tm); 
else 
    // badness 
+1

を私はそこに知っていなければなりませんでした –

+0

+1:私はstrptimeを考えていましたが、私はそれの関数名を思い出すことができませんでした。 。 – Powerlord

+3

Windowsを使用している場合、この質問を参照してください:http://stackoverflow.com/questions/321849/strptime-equivalent-on-windows – Powerlord

5

を用いtime_tにそれを変換し、その後、struct tmを移入するために整数に日付/時刻の各部分を変換します。

1

の組み合わせを試すことができ、私はちょうど一緒にハッキングC /擬似コードでは、有線ソリューションです。がんばろう!

char * runner = NULL; 
char *string_orig = "YYYY-MM-DD HH:MM:SS"; 
time_t time = 0; 
struct tm tmp; 

use strstr(string_orig, "-") and atoi foreach 

    tmp->tm_year .. 
    tmp->tm_mon .. 
    tmp->tm_mday .. 
    tmp->tm_hour .. 
    tmp->tm_min .. 
    tmp->tm_sec .. 

with *runner as help 

time = mktime(&tm) 
1

sscanfはどうですか? strptimeが利用できないとき

struct tm tmVar; 
char *strVar = "YYYY-MM-DD HH:MM:SS"; 
time_t timeVar; 
if(sscanf(strVar, "%d-%d-%d %d:%d:%d", &tm.tm_year, /* the other fields */)==6) 
    timeVar = mktime(&tmVar); 
else 
    // bad format 
0

はここで準備ができ抜粋です:

#include <stddef.h> 
#include <time.h> 
#include <stdio.h> 

time_t string_to_seconds(const char *timestamp_str) 
{ 
    struct tm tm; 
    time_t seconds; 
    int r; 

    if (timestamp_str == NULL) { 
     printf("null argument\n"); 
     return (time_t)-1; 
    } 
    r = sscanf(timestamp_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); 
    if (r != 6) { 
     printf("expected %d numbers scanned in %s\n", r, timestamp_str); 
     return (time_t)-1; 
    } 

    tm.tm_year -= 1900; 
    tm.tm_mon -= 1; 
    tm.tm_isdst = 0; 
    seconds = mktime(&tm); 
    if (seconds == (time_t)-1) { 
     printf("reading time from %s failed\n", timestamp_str); 
    } 

    return seconds; 
} 

は何が必要にyouselfにsscanf関数に文字列を調整します。タイムゾーンを無視し、GMT/UTCはtimezone(または_timezonesecondsから(time.hにDSTに定義されているグローバルtimezoneがすでにtmtm_isdstフィールドをゼロにすることにより無視されるsubstractとして常に変換するには。

関連する問題