Как преобразовать строку даты, отформатированную как "MM-DD-YY HH:MM:SS"
, в значение time_t
на C или C++?Преобразование даты/времени: представление строки в time_t
ответ
Используйте strptime()
, чтобы разобрать время на struct tm
, а затем используйте mktime()
для преобразования в time_t
.
Боюсь, что в стандартном C/C++ нет ни одного. Существует функция POSIX strptime
, которая может конвертировать в struct tm
, которая затем может быть преобразована в time_t
с использованием mktime
.
Если вы нацелены на совместимость с кросс-платформой, лучше используйте boost::date_time
, который имеет сложные функции для этого.
Библиотека времени времени Boost должна помочь; в частности, вы можете захотеть взглянуть на http://www.boost.org/doc/libs/1_37_0/doc/html/date_time/date_time_io.html
В отсутствие strptime
вы могли бы использовать sscanf
для анализа данных в struct tm
, а затем вызвать mktime
. Не самое изящное решение, но оно будет работать.
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(...)
{
}
}
Заметим, что 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.
лучший способ преобразовать строку даты, в формате «ММ-ДД-ГГ ЧЧ: ММ: СС», в 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 ЧЧ: ММ: СС "является местных времени.
- 1. C - time_t строковое представление
- 2. Строковое представление time_t?
- 3. Преобразование строки из __DATE__ в time_t
- 4. Преобразование time_t в timeval
- 5. Преобразование timeval в time_t
- 6. Преобразование time_t в int
- 7. Преобразование time_t в строку
- 8. Преобразование миллисекунд в time_t
- 9. Преобразование time_t в int64_t
- 10. Преобразование double to time_t
- 11. Преобразование объекта time_t в NSDate?
- 12. Преобразование localtime в time_t (C++)
- 13. Преобразование строки в шестнадцатеричное представление
- 14. Преобразование stable_clock :: time_point to time_t
- 15. Преобразование time_t в тм в частности timezome
- 16. Преобразование строки в двоичное представление в python
- 17. Преобразование SQLite Date Field в C++ Time_T
- 18. Преобразование time_t из локальной зоны в UTC
- 19. Преобразование long int в const time_t
- 20. Преобразование MySQL Datetime в C++ std :: time_t
- 21. Преобразование строки в представление дерева с правилами
- 22. Преобразование time_t в строку и строку в time_t дает неправильный год и час
- 23. Преобразование time_t в строку в заданном формате в C
- 24. Преобразование из SYSTEMTIME в time_t выдает Время в UTC/GMT
- 25. Ошибка синтаксиса для строки time_t st_mtime?
- 26. Получите time_t из универсальной строки времени?
- 27. Преобразование строки в шестнадцатеричное представление Unicode и обратно в C++
- 28. Преобразование строки unicode в шестнадцатеричное представление в Python
- 29. Преобразование строки в представление UTF-16 в Java
- 30. Преобразование UTC time_t в разные временные зоны C++ thread safe
strptime(), похоже, не доступен в Windows. Есть ли хорошая альтернатива? – 2008-11-26 19:17:15
Не знаю, хорошая ли альтернатива в Windows, есть несколько реализаций с открытым исходным кодом, которые можно использовать. Кроме того, если вы знаете, что дата всегда будет в указанном вами формате, вы можете проанализировать ее в struct tm, возможно, используя sscanf, а затем использовать mktime для получения time_t. – 2008-11-26 19:23:46
вот пример http://stackoverflow.com/a/11213640/1115059 – Jaydeep 2014-09-19 01:46:29