2008-11-26 4 views

ответ

18

Используйте strptime(), чтобы разобрать время на struct tm, а затем используйте mktime() для преобразования в time_t.

+0

strptime(), похоже, не доступен в Windows. Есть ли хорошая альтернатива? – 2008-11-26 19:17:15

+0

Не знаю, хорошая ли альтернатива в Windows, есть несколько реализаций с открытым исходным кодом, которые можно использовать. Кроме того, если вы знаете, что дата всегда будет в указанном вами формате, вы можете проанализировать ее в struct tm, возможно, используя sscanf, а затем использовать mktime для получения time_t. – 2008-11-26 19:23:46

+0

вот пример http://stackoverflow.com/a/11213640/1115059 – Jaydeep 2014-09-19 01:46:29

2

Боюсь, что в стандартном C/C++ нет ни одного. Существует функция POSIX strptime, которая может конвертировать в struct tm, которая затем может быть преобразована в time_t с использованием mktime.

Если вы нацелены на совместимость с кросс-платформой, лучше используйте boost::date_time, который имеет сложные функции для этого.

4

В отсутствие strptime вы могли бы использовать sscanf для анализа данных в struct tm, а затем вызвать mktime. Не самое изящное решение, но оно будет работать.

-1
static time_t MKTimestamp(int year, int month, int day, int hour, int min, int sec) 
{ 
    time_t rawtime; 
    struct tm * timeinfo; 

    time (&rawtime); 
    timeinfo = gmtime (&rawtime); 
    timeinfo->tm_year = year-1900 ; 
    timeinfo->tm_mon = month-1; 
    timeinfo->tm_mday = day; 
    timeinfo->tm_hour = hour; 
    timeinfo->tm_min = min; 
    timeinfo->tm_sec = sec; 
    timeinfo->tm_isdst = 0; // disable daylight saving time 

    time_t ret = mktime (timeinfo); 

    return ret; 
} 

static time_t GetDateTime(const std::string pstr) 
{ 
    try 
    { 
     // yyyy-mm-dd 
     int m, d, y, h, min; 
     std::istringstream istr (pstr); 

     istr >> y; 
     istr.ignore(); 
     istr >> m; 
     istr.ignore(); 
     istr >> d; 
     istr.ignore(); 
     istr >> h; 
     istr.ignore(); 
     istr >> min; 
     time_t t; 

     t=MKTimestamp(y,m,d,h-1,min,0); 
     return t; 
    } 
    catch(...) 
    { 

    } 
} 
1

Заметим, что strptime упомянутый в принятом ответе не переносится. Вот удобный C++ 11 кода я использую для преобразования строки в StD :: time_t:

static std::time_t to_time_t(const std::string& str, bool is_dst = false, const std::string& format = "%Y-%b-%d %H:%M:%S") 
{ 
    std::tm t = {0}; 
    t.tm_isdst = is_dst ? 1 : 0; 
    std::istringstream ss(str); 
    ss >> std::get_time(&t, format.c_str()); 
    return mktime(&t); 
} 

Вы можете назвать это так:

std::time_t t = to_time_t("2018-February-12 23:12:34"); 

Вы можете найти параметры форматирования строки here.

1

лучший способ преобразовать строку даты, в формате «ММ-ДД-ГГ ЧЧ: ММ: СС», в time_t

Ограничение кода для функций стандартной библиотеки C ищет обратного от strftime(). Чтобы развернуть @Rob общая идея, использует sscanf().

Использование "%n" для обнаружения Законченные Scan

time_t date_string_to_time(const char *date) { 
    struct tm tm = { 0 }; // Important, initialize all members 
    int n = 0; 
    sscanf(date, "%d-%d-%d %d:%d:%d %n", &tm.tm_mon, &tm.tm_mday, &tm.tm_year, 
     &tm.tm_hour, &tm.tm_min, &tm.tm_sec, &n); 
    // If scan did not completely succeed or extra junk 
    if (n == 0 || date[n]) { 
    return (time_t) -1; 
    } 
    tm.tm_isdst = -1; // Assume local daylight setting per date/time 
    tm.tm_mon--;  // Months since January 
    // Assume 2 digit year if in the range 2000-2099, else assume year as given 
    if (tm.tm_year >= 0 && tm.tm_year < 100) { 
    tm.tm_year += 2000; 
    } 
    tm.tm_year -= 1900; // Years since 1900 
    time_t t = mktime(&tm); 
    return t; 
} 

Дополнительный код может быть использован, чтобы гарантировать только 2 части значные метки времени, положительные значения, отступы и т.д.

Примечание: это предполагают в «ММ-ДД -YY ЧЧ: ММ: СС "является местных времени.

Смежные вопросы