strptime ()- Convertir serie en fecha/hora

Formato

#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);

Nivel de idioma

XPG4

De hebra segura

Sensible al entorno local

El comportamiento de esta función puede verse afectado por las categorías LC_CTYPE, LC_TIME y LC_TOD del entorno local actual. Esta función no está disponible cuando se especifica LOCALETYPE (*CLD) en el mandato de compilación. Para obtener más información, consulte Descripción de CCSID y entornos locales.

Descripción

La función strptime() convierte la serie de caracteres a la que apunta buf en valores almacenados en la estructura tm a la que apunta tm, utilizando el formato especificado por format.

El formato contiene cero o más directivas. Una directiva contiene un carácter ordinario (no% o un espacio en blanco) o una especificación de conversión. Cada especificación de conversión se compone de un carácter% seguido de uno o más caracteres de conversión, que especifican la sustitución necesaria. Debe haber un espacio en blanco u otro delimitador en buf y formato para que se garantice que la función se comportará como se esperaba. Debe haber un delimitador entre dos conversiones de serie a número, o la primera conversión de número puede convertir caracteres que pertenecen al segundo especificador de conversión.

Cualquier espacio en blanco (especificado por isspace()) que se encuentre antes de que se explore una directiva en la serie de formato o en la serie de entrada se ignorará. Una directiva que es un carácter ordinario debe coincidir exactamente con el siguiente carácter explorado en la serie de entrada. Las mayúsculas y minúsculas son relevantes cuando coinciden con las directivas de caracteres ordinarios. Si la directiva de caracteres ordinarios de la serie de formato no coincide con el carácter de la serie de entrada, strptime() no se ejecuta correctamente. No se explorarán más caracteres.

Cualquier otra especificación de conversión se compara explorando los caracteres de la serie de entrada hasta que se encuentra un carácter que no es un carácter posible para dicha especificación o hasta que no se pueden explorar más caracteres. Si la especificación era de serie a número, el rango de caracteres posible es +,-o un carácter especificado por isdigit(). Los especificadores de número no requieren ceros iniciales. Si la especificación necesita coincidir con un campo en el entorno local actual, la exploración se repite hasta que se encuentra una coincidencia. Las mayúsculas y minúsculas se ignoran cuando coinciden los campos en el entorno local. Si se encuentra una coincidencia, la estructura a la que apunta tm se actualizará con la información de entorno local correspondiente. Si no se encuentra ninguna coincidencia, strptime() no es satisfactorio. No se explorarán más caracteres.

Los campos que faltan en la estructura tm pueden ser rellenados por strptime() si se proporciona suficiente información. Por ejemplo, si se proporciona una fecha, se puede calcular tm_yday .

Cada especificación de conversión estándar se sustituye por los caracteres adecuados tal como se describe en la tabla siguiente:

Especificador Significado
%a Nombre del día de la semana, puede ser el nombre completo o una abreviatura.
%A Igual que %a.
%b Nombre de mes, puede ser el nombre completo o una abreviatura.
%B Igual que %b.
%c Fecha/hora, en el formato del entorno local.
%C Número de siglo [00-99]. Calcula el año si se utiliza un año de dos dígitos.
%d Día del mes [1-31].
%D Formato de fecha, igual que %m/%d/%y.
%e Igual que %d.
%g Parte anual de 2 dígitos de la fecha de la semana ISO [00-99].
%G Parte de año de 4 dígitos de la fecha de semana ISO. Puede ser negativo.
%h Igual que %b.
%H Hora en formato de 24 horas [0-23].
%I Hora en formato de 12 horas [1-12].
%j Día del año [1-366].
%m Mes [1-12].
%M Minuto [0-59].
%n Omitir todos los espacios en blanco hasta que se encuentre un carácter de nueva línea.
%p Serie AM o PM, utilizada para calcular la hora si se utiliza el formato de 12 horas.
%r Hora en formato AM/PM del entorno local. Si no está disponible en el formato de hora del entorno local, el valor predeterminado es el formato AM/PM de hora POSIX : %I: %M: %S %p.
%R Formato de hora de 24 horas sin segundos, igual que %H: %M.
%S Segundo [00-61]. El rango de segundos permite un segundo bisiesto y un segundo bisiesto doble.
%t Omita todos los espacios en blanco hasta que se encuentre un carácter de tabulación.
%T Formato de hora de 24 horas con segundos, igual que %H: %M: %S.
%u Día de la semana [1-7]. El lunes es 1 y el domingo es 7.
%U Número de semana del año [0-53], el domingo es el primer día de la semana. Se utiliza en el cálculo del día del año.
%V Número de semana ISO del año [1-53]. El lunes es el primer día de la semana. Si la semana que contiene el 1 de enero tiene cuatro o más días en el nuevo año, se considera semana 1. De lo contrario, es la última semana del año anterior, y la siguiente semana es la semana 1 del nuevo año. Se utiliza en el cálculo del día del año.
%w Día de la semana [0 -6]. El domingo es 0.
%W Número de semana del año [0-53]. El lunes es el primer día de la semana. Se utiliza en el cálculo del día del año.
%x Fecha en el formato del entorno local.
%X Hora en el formato del entorno local.
%y Año de 2 dígitos [0-99].
%Y Año de 4 dígitos. Puede ser negativo.
%z Diferencia respecto de la hora universal coordinada. La salida es una serie con el formato +HHMM o -HHMM, donde + indica el este de GMT,-indica el oeste de GMT, HH indica el número de horas desde GMT y MM indica el número de minutos desde GMT.
%Z Nombre de huso horario.
%% %.

Especificadores de conversión modificados

Algunos especificadores de conversión pueden ser modificados por los caracteres de modificador E u O para indicar que se debe utilizar un formato o especificación alternativo. Si un especificador de conversión modificado utiliza un campo en el entorno local actual que no está disponible, el comportamiento será como si se utilizara la especificación de conversión no modificada. Por ejemplo, si la serie era es la serie vacía "", lo que significa que era no está disponible, entonces %EY actuaría como %Y.

Especificador Significado
%Ec Fecha/hora de la era actual.
%CE Nombre de era.
%Ex Fecha de la era actual.
%EX Hora de la era actual.
%Ey Año de la era. Este es el desplazamiento del año base.
%EY Año para la era actual.
%Od Día del mes utilizando dígitos alternativos.
%Oe Igual que %Od.
%OH Hora en formato de 24 horas utilizando dígitos alternativos.
%OI Hora en formato de 12 horas utilizando dígitos alternativos.
%Om Mes utilizando dígitos alternativos.
%OM Minutos utilizando dígitos alternativos.
%SO Segundos utilizando dígitos alternativos.
%Ou Día de la semana utilizando dígitos alternativos. El lunes es 1 y el domingo es 7.
%UO Número de semana del año utilizando dígitos alternativos. El domingo es el primer día de la semana.
%OV Número de semana ISO del año utilizando dígitos alternativos. Consulte %V para obtener una explicación del número de semana ISO.
%Ow Día de la semana utilizando un dígito alternativo. El domingo es 0 y el sábado es 6.
%OW Número de semana del año utilizando dígitos alternativos. El lunes es el primer día de la semana.
%Oy Año de 2 dígitos utilizando dígitos alternativos.
%OZ Nombre de huso horario abreviado.

Valor de retorno

Al finalizar correctamente, la función strptime() devuelve un puntero al carácter que sigue al último carácter analizado. De lo contrario, se devuelve un puntero nulo. El valor de errno se puede establecer en ECONVERT (error de conversión).

Ejemplo

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

int main(void)
{
    char buf[100];
    time_t t;
    struct tm *timeptr,result;

    setlocale(LC_ALL,"/QSYS.LIB/EN_US.LOCALE");
    t = time(NULL);
    timeptr = localtime(&t);
    strftime(buf,sizeof(buf), "%a %m/%d/%Y %r", timeptr);

    if (strptime(buf, "%a %m/%d/%Y %r",&result) == NULL)
          printf("\nstrptime failed\n");
    else
    {
          printf("tm_hour:  %d\n",result.tm_hour);
          printf("tm_min:  %d\n",result.tm_min);
          printf("tm_sec:  %d\n",result.tm_sec);
          printf("tm_mon:  %d\n",result.tm_mon);
          printf("tm_mday:  %d\n",result.tm_mday);
          printf("tm_year:  %d\n",result.tm_year);
          printf("tm_yday:  %d\n",result.tm_yday);
          printf("tm_wday:  %d\n",result.tm_wday);
    }
 
    return 0;
}

/************************************************************
     The output should be similar to:
     Tue 10/30/2001 10:59:10 AM
     tm_hour:  10
     tm_min:  59
     tm_sec:  10
     tm_mon:  9
     tm_mday:  30
     tm_year:  101
     tm_yday:  302
     tm_wday:  2
************************************************************/

Información relacionada