2009-09-18 8 views
41

Ich habe so etwas wie dies:, wie man Datum und Uhrzeit Wert in C-Programm

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

Es druckt den aktuellen Tag und die Uhrzeit in den stdout, aber ich mag diese Ausgabe erhalten oder sie zu den current_day zuweisen und current_time Variablen, so dass ich später mit diesen Werten etwas verarbeiten kann.

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

Die einzige Lösung, die ich jetzt denken kann, ist die Ausgabe zu einem gewissen Datei zu lenken, und dann die Datei lesen und dann die Werte von Datum und Uhrzeit current_day und current_time zuweisen. Aber ich denke, das ist kein guter Weg. Gibt es einen anderen kurzen und eleganten Weg?

+0

Sie müssen lesen [Zeit (7)] (http://man7.org/linux/man-pages/man7/time.7.html) zuerst ... –

Antwort

92

Verwenden time() und localtime() die Zeit zu bekommen:

#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

Wenn ich versuche, zu kompilieren, bekomme ich diesen Fehler test.c: 13: Warnung: übergeben Argument 1 von "localtime" von inkompatiblen Zeigertyp, was soll ich tun? –

+1

Sie übergeben keine 'struct tm *' an 'localtime' - diese Zeile sollte' tm = * localtime sein (&t); ' – caf

+0

Bah, so dumm von mir. Danke, jetzt behoben. –

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

Sie auch strftime können Sie die Zeit in einen String zu formatieren.

+0

Or in der Tat, "ctime()' auf dem "time_t" -Wert. – caf

+5

ctime() produziert eine schäbige nicht-internationalisierte Datum/Uhrzeit-Format. Es ist am besten vergessen über. –

-1

anstelle von Dateien verwenden, Rohre und wenn u wana verwenden C und nicht C++ kann u popen wie diese als normale Dateizeiger

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

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

und Verwendung * fp verwenden mit fgets und alle

wenn u Verwenden Sie C++ - Zeichenfolgen, verzweigen Sie ein untergeordnetes Element, rufen Sie den Befehl auf, und leiten Sie ihn an das übergeordnete Element weiter.

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

// ein ähnliches 1 für Tag machen + T, aber wirklich empfehlen i u mit Sachen bleiben in time.h GL

+2

Aufruf eines externen Programms ist übertrieben (und macht das Programm spröder) und macht es schwierig, Dinge mit der Zeit danach zu tun (z. B. Hinzufügen eines Offsets). Genau das wollte das OP vermeiden. Und das ist "Datum", nicht "Datum". – bortzmeyer

+1

ich stimme völlig zu, aber um den Kerl fragte nach einer Möglichkeit, den Befehl aufzurufen und seine Ausgabe in seinem prog verwenden, gab ich ihm, was er wollte! und doch habe ich am ende gesagt, bleib bei der uhrzeit. denn das ist das richtige zu tun: S ich kann nichts falsches mit meiner antwort sehen: Wie bei "Date" habe ich das behoben. – omarzouk

+0

Shooting Spatzen mit einem Rohr. –

0

Die Antworten oben angegebenen Werte sind gut CRT Antworten, aber wenn Sie möchten, können auch Verwenden Sie dazu die Win32-Lösung. Es ist fast identisch, aber IMO, wenn Sie für Windows sind die Programmierung Sie könnte genauso gut nur seine API (weiß nicht, ob Sie in Windows programmieren tatsächlich aber was auch immer)

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

Wie auch immer, dies ist Ihre Windows-Lösung. Ich hoffe, es wird dir irgendwann helfen!

-5

können Sie das aktuelle Datum und die Uhrzeit erhalten, indem vordefinierte Makros in C verwenden, wie
DATUM TIME auch können Sie das aktuelle Datum durch einen anderen Weg finden. c-forbeginners.blogspot.in erhalten Details

9

Strftime (C89)

Martin mentioned it, hier ein Beispiel:

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

Beispielausgabe:

Thu Apr 14 22:39:03 2016 

Der %c Spezifizierer erzeugt das gleiche Format wie ctime.

Ein Vorteil dieser Funktion ist, dass sie die Anzahl der geschriebenen Bytes zurückgibt, was eine bessere Fehlerkontrolle ermöglicht, falls der erzeugte String zu lang ist.

asctime und ctime (C89)

asctime ist ein bequemer Weg, eine zu forma 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)); 
} 

, die wie ein festes Ausgabeformat erzeugt:

Wed Jun 10 16:10:32 2015 

Und es ist auch ctime(), die der Standard sagt, ist eine Abkürzung für:

Wie erwähnt by Jonathan Leffler, hat das Format den Mangel, keine Zeitzoneninformationen zu haben.

POSIX 7 markiert diese Funktionen als "veraltet", so dass sie in zukünftigen Versionen entfernt werden könnte:

Die Standard-Entwickler entschieden obsolescent die asctime() und asctime_r() Funktionen zu markieren, obwohl asctime()

ist in der ISO C-Standard aufgrund der Möglichkeit eines Pufferüberlaufs. Der ISO-C-Standard stellt auch die Funktion strftime() zur Verfügung, die verwendet werden kann, um diese Probleme zu vermeiden.

C++ Version dieser Frage: How to get current time and date in C++?

+1

Danke! Sehr einfach, einfach und detailliert! –