¿Cómo obtener los valores de fecha y hora en un progtwig C?

Tengo algo como esto:

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

Imprime el día y la hora actuales en el stdout, pero quiero obtener este resultado o asignarlos a las variables current_day y current_time , para poder 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 luego leer el archivo y luego asignar los valores de fecha y hora a current_day y current_time . Pero creo que esta no es una buena manera. ¿Hay alguna otra manera corta y elegante?

Use time() y localtime() para obtener la hora:

 #include  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); 
 time_t rawtime; time ( &rawtime ); struct tm *timeinfo = localtime ( &rawtime ); 

También puede usar strftime para formatear la hora en una cadena.

strftime (C89)

Martin lo mencionó , he aquí un ejemplo:

 #include  #include  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); } 

Muestra de salida:

 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 forma conveniente de formatear una struct tm :

 #include  #include  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 también hay ctime() que el estándar dice que es un atajo para:

 asctime(localtime()) 

Como mencionó Jonathan Leffler , el formato tiene la desventaja de no tener información de zona horaria.

POSIX 7 marcó esas funciones como “obsoletas” por lo que podrían eliminarse en futuras versiones:

Los desarrolladores estándar decidieron marcar las funciones asctime () y asctime_r () como obsoletas, aunque 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.

Versión C ++ de esta pregunta: ¿Cómo obtener la hora y fecha actual en C ++?

Las respuestas dadas anteriormente son buenas respuestas CRT, pero si lo desea, también puede usar la solución Win32 para esto. Es casi idéntico, pero IMO si está progtwigndo para Windows también podría usar su API (no sé si está progtwigndo en Windows en realidad, pero lo 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 su solución de Windows. Espero que te sea útil en algún momento!

Recibo el siguiente error al comstackr el código de Adam Rosenfield en Windows. Resulta que faltan algunas cosas en el código.

Error (antes)

 C:\C\Codes>gcc time.c -o time time.c:3:12: error: initializer element is not constant time_t t = time(NULL); ^ time.c:4:16: error: initializer element is not constant struct tm tm = *localtime(&t); ^ time.c:6:8: error: expected declaration specifiers or '...' before string constant 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); ^ time.c:6:36: error: expected declaration specifiers or '...' before 'tm' 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); ^ time.c:6:55: error: expected declaration specifiers or '...' before 'tm' 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); ^ time.c:6:70: error: expected declaration specifiers or '...' before 'tm' 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); ^ time.c:6:82: error: expected declaration specifiers or '...' before 'tm' 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); ^ time.c:6:94: error: expected declaration specifiers or '...' before 'tm' 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); ^ time.c:6:105: error: expected declaration specifiers or '...' before 'tm' 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); ^ C:\C\Codes> 

Solución

 C:\C\Codes>more time.c #include  #include  int main() { 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); } C:\C\Codes> 

Comstackndo

 C:\C\Codes>gcc time.c -o time C:\C\Codes> 

Salida final

 C:\C\Codes>time now: 2018-3-11 15:46:36 C:\C\Codes> 

Espero que esto ayude a otros también

Timespec tiene un día del año incorporado.

http://pubs.opengroup.org/onlinepubs/7908799/xsh/time.h.html

 #include  int get_day_of_year(){ time_t t = time(NULL); struct tm tm = *localtime(&t); return tm.tm_yday; }` 

en lugar de archivos use pipes y si usa wana C y no C ++ puede usar popen como este

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

y use * fp como un puntero de archivo normal con fgets y todo

si usa cadenas de c ++, fork un hijo, invoque el comando y luego canalícelo al padre.

  #include  #include  #include  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 1 similar para la fecha + T, pero realmente te recomiendo que te quedes con las cosas a tiempo.h GL

 #include using namespace std; int main() { printf("%s",__DATE__); printf("%s",__TIME__); return 0; }