2009-09-18 958 views
41

que tienen algo como esto:cómo obtener valor de fecha y hora en el programa C

char *current_day, *current_time; 
system("date +%F"); 
system("date +%T"); 

Se imprime el día y la hora actual en la salida estándar, pero quiero conseguir esta salida o asignarlos a la current_day y current_time variables, de modo que pueda hacer algún procesamiento con esos valores más adelante.

current_day ==> current day 
current_time ==> current time 

La única solución que se me ocurre ahora es dirigir la salida a algún archivo, y después lee el archivo y luego asignar los valores de fecha y hora para current_day y current_time. Pero creo que esta no es una buena manera. ¿Hay alguna otra manera corta y elegante?

+0

Es necesario leer [Tiempo (7)] (http://man7.org/linux/man-pages/man7/time.7.html) primero ... –

Respuesta

92

Uso time() y localtime() para obtener el tiempo:

#include <time.h> 

time_t t = time(NULL); 
struct tm tm = *localtime(&t); 

printf("now: %d-%d-%d %d:%d:%d\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); 
+1

Cuando intento compilar, obtengo este error test.c: 13: warning: pasando el argumento 1 de 'localtime' del tipo de puntero incompatible, ¿qué debo hacer? –

+1

No pasa 'struct tm *' a 'localtime' - esa línea debe ser' tm = * localtime (&t); ' – caf

+0

Bah, tan estúpido de mí. Gracias, corregido ahora. –

15
time_t rawtime; 
time (&rawtime); 
struct tm *timeinfo = localtime (&rawtime); 

También puede utilizar strftime para formatear el tiempo en una cadena.

+0

O de hecho, 'ctime()' en el valor 'time_t' – caf

+5

ctime() produce un formato de fecha/hora no internacionalizado. Lo mejor es olvidarse. –

-1

en lugar de archivos utilizan tuberías y si u wana usan C y no en C++ u puede utilizar popen como esto

#include<stdlib.h> 
#include<stdio.h> 

FILE *fp= popen("date +F","r"); 

y el uso * fp como un puntero a un archivo normal con fgets y todos

si u Wana usa cadenas de C++, tenedor a hijo, invoque el comando y luego canalícelo al padre.

#include <stdlib.h> 
    #include <iostream> 
    #include <string> 
    using namespace std; 

    string currentday; 
    int dependPipe[2]; 

    pipe(dependPipe);// make the pipe 

    if(fork()){//parent 
      dup2(dependPipe[0],0);//convert parent's std input to pipe's output 
      close(dependPipe[1]); 
      getline(cin,currentday); 

    } else {//child 
     dup2(dependPipe[1],1);//convert child's std output to pipe's input 
     close(dependPipe[0]); 

     system("date +%F"); 
    } 

// hacer un similares 1 Fecha + T, pero realmente recomiendo u seguir con cosas en GL time.h

+2

Llamar a un programa externo es excesivo (y hace que el programa sea más frágil) y hace difícil hacer cosas con el tiempo posterior (como agregar un desplazamiento, por ejemplo). Eso es precisamente lo que OP quería evitar. Y esta es "fecha", no "Fecha". – bortzmeyer

+1

estoy totalmente de acuerdo, pero um el chico pidió una forma de invocar el comando y utilizar su salida en su prog, le di lo que él quería! y, sin embargo, dije al final, quédate con el tiempo. Porque es lo correcto: S no puedo ver nada malo con mi respuesta: S en cuanto a "Fecha", pero lo arreglé. – omarzouk

+0

Disparo de gorriones con una pipa. –

0

Las respuestas dadas anteriormente son buenas respuestas CRT, pero si lo desea, también puede usa la solución Win32 para esto. Es casi idéntico, pero la OMI si programas para Windows que también podría simplemente utilizar su API (¡no sé si está programando en realidad ventanas pero cualquiera que sea)

char* arrDayNames[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; // Jeez I hope this works, I haven't done this in ages and it's hard without a compiler.. 
SYSTEMTIME st; 
GetLocalTime(&st); // Alternatively use GetSystemTime for the UTC version of the time 
printf("The current date and time are: %d/%d/%d %d:%d:%d:%d", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 
printf("The day is: %s", arrDayNames[st.wDayOfWeek]); 

De todos modos, esta es tu solución ventanas. Espero que te sea útil en algún momento!

-5

puede obtener la fecha y hora actuales mediante el uso de macros predefinidas en C, como
FECHA TIEMPO También usted puede encontrar fecha actual por otro camino. c-forbeginners.blogspot.in para obtener detalles

9

strftime (C89)

Martin mentioned it, he aquí un ejemplo:

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

int main() { 
    time_t t = time(NULL); 
    struct tm *tm = localtime(&t); 
    char s[64]; 
    strftime(s, sizeof(s), "%c", tm); 
    printf("%s\n", s); 
} 

Salida de ejemplo:

Thu Apr 14 22:39:03 2016 

El especificador %c produce el mismo formato que ctime.

Una ventaja de esta función es que devuelve el número de bytes escritos, lo que permite un mejor control de errores en caso de que la cadena generada sea demasiado larga.

asctime y ctime (C89)

asctime es una manera conveniente para formatear un struct tm:

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

int main() { 
    time_t t = time(NULL); 
    struct tm *tm = localtime(&t); 
    printf("%s\n", asctime(tm)); 
} 

que produce un formato de salida fijo como:

Wed Jun 10 16:10:32 2015 

Y hay también es ctime() que el estándar dice es un atajo para:

asctime(localtime()) 

Como se mencionó by Jonathan Leffler, el formato tiene el inconveniente de no tener información de zona horaria.

POSIX 7 marcado esas funciones como "obsoleta" para que pudieran ser eliminadas en futuras versiones:

Los desarrolladores estándar decidieron marcar el asctime() y asctime_r() funciones de obsolescencia a pesar de que asctime() está en el estándar ISO C debido a la posibilidad de desbordamiento del búfer. El estándar ISO C también proporciona la función strftime() que se puede usar para evitar estos problemas.

C++ versión de esta pregunta: How to get current time and date in C++?

+1

¡Gracias! ¡Muy fácil, simple y detallado! –

Cuestiones relacionadas