¿Cómo convierto una cadena de fecha, formateada como "MM-DD-YY HH:MM:SS"
, en un valor time_t
en C o C++?Conversión de fecha/hora: representación de cadena a time_t
Respuesta
Use strptime()
para analizar el tiempo en un struct tm
, luego use mktime()
para convertirlo a time_t
.
Me temo que no hay ninguno en el estándar C/C++. Existe la función POSIX strptime
que se puede convertir a struct tm
, que luego se puede convertir a time_t
usando mktime
.
Si está buscando la compatibilidad multiplataforma, mejor use boost::date_time
, que tiene funciones sofisticadas para esto.
La biblioteca de fecha y hora de Boost debería ayudar; en particular, es posible que desee mirar a http://www.boost.org/doc/libs/1_37_0/doc/html/date_time/date_time_io.html
En ausencia de strptime
podría utilizar sscanf
para analizar los datos en un struct tm
y luego llamar mktime
. No es la solución más elegante, pero funcionaría.
Gracias Rob ... buena foto por cierto. –
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(...)
{
}
}
Tenga en cuenta que strptime
mencionado en respuesta aceptada no es portátil. Aquí está la mano de código C++ 11 utilizo para convertir cadena a 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);
}
se le puede llamar así:
std::time_t t = to_time_t("2018-February-12 23:12:34");
puede encontrar parámetros de formato de cadena de here.
1) El código no establece el miembro 'tm_isdst'. No hacerlo puede generar resultados inconsistentes.2) 'struct tm' no permite miembros adicionales que se beneficien con la inicialización. Quizás 'std :: tm t = {0};'? 3) La cadena del mes de OP es numérica, no alfa, Use '"% m "' en lugar de '"% b "'. 4) OP utilizó un orden diferente a YMD hms. – chux
Agregué la opción dst. Init con 0 es una buena idea. Otras cosas se pueden ajustar fácilmente como requisitos individuales. – ShitalShah
mejor manera de convertir una cadena de fecha, el formato "MM-DD-AA HH: MM: SS", a un time_t
La restricción de código para funciones de la biblioteca estándar de C está buscando a la inversa de strftime()
. Para ampliar @Rob idea general, utiliza sscanf()
.
Uso "%n"
para detectar escaneo completado
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;
}
código adicional se podría utilizar para asegurar sólo 2 partes de dígitos de marca de tiempo, los valores positivos, espaciado, etc.
Nota: Esta asumir la "MM-DD -YY HH: MM: SS "es un local tiempo.
Interesante, nunca encontré un caso de uso para '% n' ya que siempre utilicé el valor de retorno de' * scanf' para asegurarme de que todos los argumentos fueron escaneados. Sin embargo, aparece '% n' (la forma en que lo usa) esto * y * asegura que no hay gumpf adicional siguiendo la cadena esperada. No es frecuente que aprenda algo nuevo sobre C hoy en día, así que felicitaciones :-) – paxdiablo
@paxdiablo Gracias. El '"% n "', en general, ayuda a detectar cualquier texto final requerido, algo que el valor de retorno no distingue. P.ej. '"% d xyz% n "'. – chux
- 1. Representación de cadena de time_t?
- 2. ASN1_TIME to time_t conversión
- 3. Convertir cadena de __DATE__ a un time_t
- 4. convertir cadena de texto a representación hexadecimal o representación binaria
- 5. conversión de cadena a numérico
- 6. Conversión de cadena a entero
- 7. conversión de cadena estrecha a cadena ancha
- 8. Erlang cadena bits a conversión entera
- 9. advertencia C4244: 'argumento': conversión de 'time_t' a 'unsigned int', posible pérdida de datos - C++
- 10. Conversión de una representación de bits en un byte
- 11. Servidor SQL Conversión de entero a cadena binaria
- 12. cadena a cadena de matriz de conversión en Java
- 13. Conversión de archivo binario a cadena Base64
- 14. Conversión de cadena binaria a ASCII correspondiente
- 15. conversión de cadena a largo en pitón
- 16. C#: Conversión de cadena a Sbyte *
- 17. Cadena de conversión Sqlite a la fecha
- 18. z3python: conversión de cadena a expresión
- 19. Conversión de la cadena Haml a html
- 20. Ruby - Conversión de entero a cadena
- 21. Conversión de Unicode a cadena en Java
- 22. Conversión de PDF a la cadena
- 23. Hex a cadena de conversión ascii
- 24. Conversión de cadena a puntero para JNA
- 25. conversión de bytes a una cadena C#
- 26. conversión de XML a cadena usando C#
- 27. Java: inetaddress a la conversión de cadena
- 28. cacao - conversión de un doble a cadena
- 29. cadena de conversión a long long
- 30. Ruby - cadena de conversión a la fecha
strptime() no parece estar disponible en Windows. ¿Hay una buena alternativa? –
No sé si una buena alternativa en Windows, hay varias implementaciones de código abierto flotando que podría usar. Alternativamente, si sabe que la fecha siempre estará en el formato que proporcionó, puede analizarla en una estructura tm, tal vez usando sscanf, y luego usar mktime para obtener un time_t. –
aquí hay un ejemplo http://stackoverflow.com/a/11213640/1115059 – Jaydeep