2009-09-18 19 views
41

mam coś takiego:jak uzyskać datę i wartość czasu w programie C

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

Drukuje bieżący dzień i czas w stdout, ale chcę, aby uzyskać ten wyjściowe lub przypisać je do current_day i current_time zmiennych, dzięki czemu mogę później przetwarzać te wartości.

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

Jedynym rozwiązaniem, które mogę myśleć teraz jest przekierować do jakiegoś pliku, a następnie odczytać pliku, a następnie przypisać wartości daty i czasu do current_day i current_time. Ale myślę, że to nie jest dobra droga. Czy istnieje inny krótki i elegancki sposób?

+0

Musisz przeczytać [czas (7)] (http://man7.org/linux/man-pages/man7/time.7.html) pierwszy ... –

Odpowiedz

92

Zastosowanie time() i localtime() aby uzyskać czas:

#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

Gdy próbuję skompilować, otrzymuję ten test.c: 13: ostrzeżenie: przekazanie argumentu 1 "localtime" z niezgodnego typu wskaźnika, co mam zrobić? –

+1

Nie przekazujesz 'struct tm *' do 'localtime' - ta linia powinna być' tm = * localtime (&t); ' – caf

+0

Bah, tak głupia ode mnie .. Dzięki, naprawiono teraz –

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

Można również użyć strftime formatować czas na ciąg znaków.

+0

Lub w rzeczy samej, 'ctime()' na wartości 'time_t'. – caf

+5

ctime() tworzy nieprywatyzowany format daty/czasu, o którym najlepiej zapomnieć: –

-1

zamiast plików stosować rur i jeśli u wana użyć C i nie C++ można korzystać popen jak ten

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

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

i użyciu * fp jako normalnego wskaźnika pliku z fgets i wszystkich

jeśli u Wana używa ciągów C++, rozwidla dziecko, wywołuje polecenie, a następnie przekazuje je do rodzica.

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

// uczynić podobnym do daty 1 + T, ale naprawdę polecam u trzymać rzeczy w time.h GL

+2

Wywołanie programu zewnętrznego jest przesadą (i powoduje, że program jest bardziej kruchy) i sprawia, że ​​trudno jest robić rzeczy z czasem (np. dodając przesunięcie, na przykład). Właśnie tego OP chciał uniknąć. A to jest "data", a nie "Data". – bortzmeyer

+1

Całkowicie się zgadzam, ale um facet poprosił o sposób na wywołanie polecenia i wykorzystanie jego wyników w jego progu, dałem mu to, co CHCIAŁ! a jednak powiedziałem na koniec, trzymaj się czasu. To jest właściwa rzecz: Nie widzę niczego złego w mojej odpowiedzi: S n jak na "Data", tak naprawiłem. – omarzouk

+0

Strzelanie wróbli rurą. –

0

Odpowiedzi podane powyżej są dobre odpowiedzi CRT, ale jeśli chcesz, możesz również użyj do tego rozwiązania Win32. To prawie identyczne, ale IMO jeśli programowania dla Windows, równie dobrze można po prostu użyć swojego API (dunno jeśli programowanie w windows faktycznie ale cokolwiek)

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]); 

W każdym razie, jest to rozwiązanie okna. Mam nadzieję, że kiedyś okaże się to pomocne!

-5

można uzyskać bieżącą datę i godzinę za pomocą predefiniowanych makr w języku C, jak
DATA CZASU również można znaleźć aktualną datę w inny sposób. c-forbeginners.blogspot.in aby uzyskać szczegółowe

9

strftime (C89)

Martin mentioned it, oto przykład:

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

Przykładowe wyjście:

Thu Apr 14 22:39:03 2016 

%c specifier produkuje ten sam format, jak ctime.

Jedną z zalet tej funkcji jest to, że zwraca ona liczbę zapisanych bajtów, co pozwala na lepszą kontrolę błędów w przypadku, gdy wygenerowany ciąg znaków jest zbyt długi.

asctime i ctime (C89)

asctime jest wygodnym sposobem sformatować 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)); 
} 

który wytwarza stały format wyjściowy jak:

Wed Jun 10 16:10:32 2015 

i tam jest również ctime(), który według standardu jest skrótem dla:

asctime(localtime()) 

Jak wspomniano o by Jonathan Leffler, format ma wadę polegającą na braku informacji o strefie czasowej.

POSIX 7 zaznaczono te funkcje jako „przestarzałe”, więc mogą one zostać usunięte w przyszłych wersjach:

Standardowe deweloperzy postanowili oznaczyć asctime() i asctime_r() Funkcje przestarzałe choć asctime() jest w standard ISO C ze względu na możliwość przepełnienia bufora. Standard ISO C udostępnia również funkcję strftime(), której można użyć w celu uniknięcia tych problemów.

C++ wersja tego pytania: How to get current time and date in C++?

+1

Dziękujemy! Bardzo proste, proste i szczegółowe! –

Powiązane problemy