c++ - funciones - Conversión de fecha/hora: representación de cadena a time_t
funciones de fecha y hora en c++ (6)
En ausencia de strptime
puede usar sscanf
para analizar los datos en una struct tm
y luego llamar a mktime
. No es la solución más elegante, pero funcionaría.
¿Cuál es la mejor manera de convertir una cadena de fecha, formateada como "MM-DD-YY HH:MM:SS"
, a un valor de time_t
en C o C ++?
La biblioteca de fecha y hora de Boost debería ayudar; en particular, es posible que desee consultar http://www.boost.org/doc/libs/1_37_0/doc/html/date_time/date_time_io.html
Me temo que no hay ninguno en el estándar C / C ++. Está el strptime
función POSIX que puede convertirse en struct tm
, que luego puede convertirse en time_t
usando mktime
.
Si está buscando la compatibilidad multiplataforma, mejor use boost::date_time
, que tiene funciones sofisticadas para esto.
Utilice strptime()
para analizar el tiempo en una struct tm
, luego use mktime()
para convertir a un time_t
.
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(...)
{
}
}
Estoy tratando de procesar la fecha y hora almacenadas. Guardo el archivo en la fecha y hora GMT en formato de cadena (es decir, DDMMYYYYHHMMSS). Cuando las consultas del cliente a continuación, convierto esta cadena de fecha y hora a formato struct tm y luego lo convierte a segundos usando mktime. Lo hago para verificar el DateTime no válido. De nuevo, convierto segundos a formato de cadena. Todos estos procesos están bien y no hay ningún problema.
Pero tengo un problema con Weied, es decir, guardé la fecha y la hora en GMT y localicé también GMT. Debido al ahorro de luz diurna, mi hora local cambió a GMT + 1 ahora si consulto la fecha y hora almacenadas obtengo 1 hora menos porque la función mktime usa la configuración regional, es decir GMT + 1 para convertir struct tm en segundos (tm_isdst establecido en -1 por lo que mktime detecta los ahorros de luz diurna, etc. automáticamente).
Alguna idea, como resolver este problema?