time_t / timestamp umwandeln



  • time_t timestamp;
      timestamp = time(NULL);
    
      printf("%d",timestamp);
    

    ich benötige den Unix Timestamp, den bekomme ich ja mit time(NULL) geliefert, wie kann ich den aber nun ausgeben?
    Mein printf() funktioniert zwar, aber beim Compilen gibts eine Warnung: int format, time_t arg (arg 10)

    wie kann ich das abstellen?

    Gruß
    Dominik



  • %ld oder %lu (glaube ich).



  • in lesbarem Format?

    Vielleicht als Idee folgendes:

    char *totimestamp(char *strp, time_t *timep)
    /* get the actual time stamp e.g. for debugging purposes from given time */
    /* with format: YY-MM-DD HH:MM:SS */
    /* char *strp;		/*  O:   ptr to string */
    /* time_t *timep;	/*  I:   ptr to time_t */
    			/* ret:	ptr to string "strp" */
    /* NOTE: may by used with strp==NULL but only if no parallel call may occur */
    /*       e.g. for debugging purposes, must not be more than NHSTR times used */
    /*       at parameter list */
    {
    #ifndef NHSTR
    #define	NHSTR	20		/* no of help strings (for parallel calls) */
    #endif
    static char hstr[NHSTR][20];
    static int hix;
    register struct tm *tp;
    if (timep == 0)
        {
        if (strp == NULL)
    	{
    	hix = (++hix) % NHSTR;
    	strp = hstr[hix];
    	}
        strcpy(strp,"00-00-00 00:00:00");
        }
    else
        {
        if (strp == NULL)
    	{
    	hix = (++hix) % NHSTR;
    	strp = hstr[hix];
    	}
        tp = localtime(timep);
        sprintf(strp,"%02d-%02d-%02d %02d:%02d:%02d",
    	    tp->tm_year-100,
    	    tp->tm_mon+1,
    	    tp->tm_mday,
    	    tp->tm_hour,
    	    tp->tm_min,
    	    tp->tm_sec);
        }
    return(strp);
    }
    
    /******************************************************************************/
    
    char *timestamp(char *strp)
    /* get the actual time stamp e.g. for debugging purposes */
    /* with format: YY-MM-DD HH:MM:SS */
    /* calls totimestamp() */
    /* char *strp;		        /* O:   ptr to string */
    				/* ret:	ptr to string "strp" */
    /* NOTE: may by used with strp==NONE but only if no parallel call may occur */
    {
    time_t tloc;
    time(&tloc);
    return(totimestamp(strp,&tloc));
    }
    
    /******************************************************************************/
    
    /* ... und der Aufruf: */
    
    char datestr[100];
    
    printf("%s",timestamp(datestr));
    
    /* oder: */
    
    printf("%s",timestamp(NULL));
    

    Extrakt aus bestehendem Code, muss natürlich noch den Gegebenheiten angepasst werden bzw. nur die entscheidenen Stellen als Ideen-Klau entnommen werden. Einrücken der Blockstruktur klappt wieder nicht bei copy-and-paste, weil Tabs nicht korrekt berücksichtigt wurden 😞

    P.S.: Bei Bedarf habe ich auch noch 'ne Version mit msec.



  • was isn timestamp nach deiner meinung? ein string oder was? häh? naja

    man: ctime
    man: asctime

    MfG,
    Ranner



  • Um es in nen String umzuwandeln, reicht ein einfaches

    time_t now = time(NULL);
    
    strftime(timedatestr, sizeof(timedatestr), "[%H:%M:%S %m/%d/%Y]", localtime(&now));
    


  • Hi feigling, stimmt natürlich 😉

    Ich hatte strftime() für mich persönlich nur verworfen (und offenbar "dauerhaft" verdrängt), weil ich eine Timestamp-Ausgabe in Trace-Meldungen bzw. Start/Stop-Meldungen benötigte, und mir die Zeit zum Scannen des Format-Strings bei strftime() zu kostbar bar 😉



  • @Ranner: Was gibtn printf deiner Meinung nach aus? ein time_t oder was? häh? naja 👎

    Greetz, Swordfish



  • Swordfish schrieb:

    @Ranner: Was gibtn printf deiner Meinung nach aus? ein time_t oder was? häh? naja 👎

    Greetz, Swordfish

    Häh was ist los? Die ganze Frage ist unverständlich. Und meine Antwort ist doch super.

    PS. Irgendein Depp (vermutlich TGGC) hat sich meinen Namen registriert. Man wird aber langfristig an der Qualität meiner Posts (und der schlechten Qualität seiner Posts) erkennen, daß ich der richige Ranner bin.

    MfG,
    Ranner



  • Ranner schrieb:

    was isn timestamp nach deiner meinung? ein string oder was? häh?

    Bei Wikipedia:

    Die am weitesten verbreitete Art von Zeitstempeln ist wohl die Unixzeit, welche die Anzahl der Sekunden seit dem 1. Januar 1970 00:00 Uhr UTC angibt

    Ich möchte in der Datenbank den Zeitstempel(Sekunden von 1970) speichern.

    %ld bei printf hat mir das richtige zurückgegeben 🙂

    Nur jetzt brauche ich wieder den umgekehrten Weg ...
    Ich habe die Sekunden ab 1970 in einer Int-Variable,

    time_t now = time(NULL); // das hier einfach ersetzen durch 
    time_t now = 1018274; // die Zahl stellt meinen Zeitstempel dar.
    
    strftime(timedatestr, sizeof(timedatestr), "[%H:%M:%S %m/%d/%Y]", localtime(&now));
    

    Gruß und vielen Dank für eure Hilfe!

    Dominik



  • freakx0 schrieb:

    Ich möchte in der Datenbank den Zeitstempel(Sekunden von 1970) speichern.

    was haste denn für'n datenbanksystem? vielleicht kann das selber timestamps erzeugen (können die meisten)? wenn ja, dann brauchst du nix mit c rumzuwurschteln...



  • ich verwende postgre. da ich aber mehrere inserts habe und postgres mit microtime arbeitet, habe ich dann unterschiedliche "zeiten" da die datensätze aber zusammenhängen müssen die das gleiche datum haben. Darum der Weg über C.

    Gruß
    Dominik


Anmelden zum Antworten