timestamp und typenumwandlung

soeni1987

Mitglied
Ich hab irgendwie gerade nen Blackout und komm nicht weiter. ich lese aus einer datei einen Unix Timestamp aus (der in einem char landet) diesen Timestamp möchte ich soweit zerflücken, dann ich das datum (Beispiel 19.09.1987) herraus bekomme und die Jahre, die seit diesem Datum vergangen sind. (20)

Ich hab mich durch die Timefunktionen gewurschtelt, bin jedoch schon daran gescheitert, dass ich nichts gefunden habe, mit dem ich einen unix Timestamp in eine Zeit respektive ein Datum umgemodelt bekomme. lediglich die Funktion time();, welche ebenfalls einen timestamp zurückliefert. muss ich mir jezt selber eine funktion basteln oder gibts da was?

Ein weiteres Problem ist für mich die Umwandlung von char in ein time_t typ. Folgendes hab ich bereits gemacht:

Code:
time_t rawtime;  // 
rawtime = const_cast<time_t>(acUser);             //geht natürlich nicht aber umwandling von der char acUser in time_t rawtime
struct tm * timeinfo = localtime ( &rawtime ); //hiermit könnte ich ja dann datum usw. ausgeben.

Für die Altersberechnung gibt es das gleiche Problem erstmal die Typenumwandlungen. ansonsten muss man ja nur den gespeicherten Timestamp von dem Heutiegen abziehen und die Differen durch (60/60/24/365.25) teilen.

danke im vorraus sönke
 
teile hab ich gelößt, jetzt ist nur ein weiteres problem entstanden:

Code:
             sscanf (acUser,"%d",&rawtime);             //umwandeln 
             timeinfo = localtime ( &rawtime );
             strftime (times,80,"%d.%m.%Y",timeinfo);

das funktioniert auch, jedoch nur solange wie die werte positiv sind. für daten vor 1970 stürzt das programm ab.

auch hab ich leider immer noch nichts gefunden, wie ich das alter ermittle.
 
Hi.

Das Problem ist, dass laut POSIX Standard der Typ time_t nicht genau spezifiziert ist. Es könnte sich um einen vorzeichenbehafteten 32 Bit Wert oder 64 Bit Wert handeln...

Benutzt du wirklich nur C oder hast du C++?

Gruß

PS: Sehe gerade den const_cast von oben - also muss es sich um C++ handeln:
C++:
istringstream iss ("-49404");
time_t t;

if (iss >> t) {
  tm* tinfo;
  if ((tinfo = localtime(&t)) != 0) {
    cout << asctime(tinfo) << endl;
  }
}
 
Zuletzt bearbeitet:
entschuldigung aber ich versteh den code nicht, was machst du da?
Ich verwende einen istringstream und lese den String "-49404" in die Variable t vom Typ time_t ein. Wenn das klappt, konvertiere ich den Wert mit localtime von GMT zur Lokalzeit. Wenn das klappt, gebe ich die Zeit mit der asctime Funktion wieder aus. Es sollte
Wed Dec 31 11:16:36 1969 herauskommen.

Gruß
 
Also bei mir gibt der garnix aus.

Code:
#include <cstdlib>
#include <iostream>

#include <time.h>
#include <sstream>


using namespace std;

int main(int argc, char *argv[])
{
    
std::istringstream iss ("-49404");
time_t t; 
        
if (iss >> t) {  
     
tm* tinfo;  
if ((tinfo = localtime(&t)) != 0) {
  
               cout << asctime(tinfo) << endl;  
               
               }} 
    system("PAUSE");
    return EXIT_SUCCESS;
}

er scheint die bedingung if ((tinfo = localtime(&t)) != 0) nicht zu erfüllen.

ps: ich benutze dev c++ als compiler
 
er scheint die bedingung if ((tinfo = localtime(&t)) != 0) nicht zu erfüllen.
Ja, das ist unter Windows anscheinend der Fall. Microsoft hat offensichtlich in seiner unglaublichen Weisheit keine neg. Werte für die Unix Zeit zugelassen. Was dazu führt, das man mit dem (eigentlich vorzeichenbehafteten) time_t Wert keine Daten vor 1. Jan. 1970 darstellen kann. :mad: Siehe http://msdn2.microsoft.com/en-US/library/bf12f0hc(VS.80).aspx
Return a pointer to the structure result, or NULL if the date passed to the function is:

*

Before midnight, January 1, 1970.

Unter Linux etc. funktioniert das (selbstredend) problemlos....

Gruß
 
Das heist dann wohl, dass es für das Problem keine Lösung gibt.
ich kann also keine daten von 1970 darstellen.

danke aber für die mühen
 
Zuletzt bearbeitet:
Das heist dann wohl, dass es für das Problem keine Lösung gibt.
ich kann also keine daten von 1970 darstellen.

danke aber für die mühen
Du könntest einen anderen Compiler verwenden. Dev-C++ verwendet standardmäßig den GCC von MinGW (und der verwendet Microsoft's Laufzeitbibliothek). Man kann Dev-C++ auch mit dem GCC von Cygwin (welches eine ziemlich vollständige Unixumgebung unter Windows bereitstellt) verwenden. Siehe http://www.cygwin.com/

Gruß
 
Zurück