time()

Thomasio

Erfahrenes Mitglied
Das wird vermutlich die dümmste Frage des Jahres, aber ich bringe es nicht auf die Reihe.

Ich habe:

Code:
time_t rawtime;
struct tm * timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
char MyLocalTime [80];
strftime (MyLocalTime,80,"Time: %H:%M",timeinfo);
std::string MyTime(MyLocalTime);

Das speichert mir die aktuelle Uhrzeit des Rechners im string, so weit kein Problem.

Jetzt möchte ich gern zusätzlich eine zweite Uhrzeit berechnen, als zweiten string speichern, und dazu die Differenz in Sekunden speichern, wobei ich von der zweiten Zeit den unix timestamp als int habe.

Ich mache also:

Code:
int ZweitTime = irgendeinTimestamp;
int PCTime = time(NULL);
int timedifferenz = PCTime - ZweitTime;

Was ich aber nicht auf die Reihe bringe:
Wie mache ich aus PCTime, ZweitTime und timedifferenz jetzt einen

std::string ZweitTimeString = ?
 
Hallo,

time_t ist in C++ als long deklariert.

Wenn ich mich recht erinnere, wird bei Holen der Systemzeit mit der time-Funktion der Zeitwert als die Anzahl Sekunden seit 1.1.1970 00:00:00 ermittelt ....

Falls also UNIX-Timestamp genauso initialisert wird /was ich vermute, aber nicht mehr gesichtert sagen kann), dann müsstest Du doch einfach die beiden Werte subtrahieren können und anschließend in den gewünschten String umwandeln kommen, oder

Gruß
Klaus
 
Problem ist nicht subtrahieren, das habe ich ja schon, Problem ist timeinfo mit etwas zu füttern, was nicht der localtime entspricht, so dass ich ins struct andere Werte rein bekomme.

Versucht habe ich sowas:

Code:
time_t rawtime = (time_t)ZweitTime;
struct tm * timeinfo;
// usw.

das "scheint" zu funktionieren, aber ich vermute, ganz sauber ist das nicht.
 
Hi.
Problem ist nicht subtrahieren, das habe ich ja schon, Problem ist timeinfo mit etwas zu füttern, was nicht der localtime entspricht, so dass ich ins struct andere Werte rein bekomme.

Versucht habe ich sowas:

Code:
time_t rawtime = (time_t)ZweitTime;
struct tm * timeinfo;
// usw.

das "scheint" zu funktionieren, aber ich vermute, ganz sauber ist das nicht.
Eine Zeitdifferenz bzw. Dauer ist eben keine Zeitangabe. Was soll denn deiner Meinung nach da rauskommen?

Gruß
 
Hallo Thomasio,

ich hoffe, dass ich Deine Frage richtig verstehe .... ;-)

Vermutlich sucht Du aber dies hier:

Code:
gmtime

Converts a time value to a structure.
 struct tm *gmtime( const time_t  *timer );

Damit sollte sich ein beliebiger tm-Struct füllen lassen.
Für den Diff, musst Du beide dann ggf. elementweise auswerten :rolleyes:

Gruß
Klaus

------------------------------------
Ergänzung:
habe eben noch die Funktion difftime entdeckt. Hier ein Beispiel aus der Hilfe:
Code:
int main( void )
{
   time_t start, finish;
   long loop;
   double result, elapsed_time;
   
   time( &start );
   for( loop = 0; loop < 10000000; loop++ )
   {
      result = 3.63 * 5.27; 
   }
   time( &finish );

   elapsed_time = difftime( finish, start );
   printf( "\nProgram takes %6.0f seconds.\n", elapsed_time );

   return 0;
}

Output
Program takes      2 seconds.
 
Zuletzt bearbeitet:
Das Ganze ist ein Spiel, was in der Vergangenheit beginnt und bis zur Gegenwart dauert, wobei die Spielzeit 100 mal schneller läuft als die Uhr, also irgendwann die aktuelle Zeit einholt.
Dazu hält das Spiel die "Spielzeit" in einer int variablen.
Um im Spiel anzuzeigen, was aktuelle Spielzeit ist und wieviel Zeit den Spielern noch bleibt muss ich also:

1) aktuelle Zeit zu int konvertieren, das geht mit time(NULL)
2) aktuelle Zeit minus Spielzeit = verbleibende Zeit
3) verbleibende Zeit in Jahre,Monate,Tage,Stunden,Minuten umrechnen
4) Spielzeit zu time_t konvertieren und localtime() damit füttern
5) aktuelle Zeit, Spielzeit und verbleibende Zeit ausgeben
 
Hm. Eigtl. ist das, was du willst keine korrekte Umformung, denn du formst eine Zeitdifferenz in einen Zeitpunkt um ;)

C++:
#include <ctime>
#include <string>
#include <iostream>

const std::string get_formated_time(const char* format)
{
    std::time_t time(std::time(NULL));
    char temp[80];
    std::strftime(temp, 80, format, std::localtime(&time));
    return std::string(temp);
}

int main()
{
    std::clog << get_formated_time("Anfang: %H:%M") << std::endl;
}
So bekommst du ja die aktuelle Zeit formatiert. Okay! Das ist klar ...

Wenn du jetzt noch std::strftime dazu nutzen willst, deine std::difftime auszugeben, bekommst du ein Problem:
It is almost universally expected to be an integral value representing the number of seconds elapsed since 00:00 hours, Jan 1, 1970 UTC. This is due to historical reasons, since it corresponds to a unix timestamp, but is widely implemented in C libraries across all platforms.
(1) Der Standard schreibt nicht vor was in time_t steht.
(2) Angenommen time_t ist wie üblich implementiert, musst du deinen Wert anpassen, damit er relativ zu 01.01.1970 um 00:00:00 ist, nicht relativ zu 0.

Das sind aber alles unnötige Probleme, denn std::strftime ist dafür nicht gedacht (beachte einleitenden Kommentar)!
Guck dir lieber mal einfach http://www.boost.org/doc/libs/1_36_0/doc/html/date_time.html an. (Wenn du nicht selber schnell die Umrechnung vornehmen willst (Was kaum Aufwand ist!) )
 
Es gibt 1000 Seiten im Web, die mir sagen WAS ich tun muss, aber keine einzige, die mir sagt, WIE man das macht.

Selber machen wäre mir schon lieber, vor allem weil ich es dabei lernen würde statt bei anderen abzukupfern.
Ich brauche weder gmtime, noch strftime, ich brauche lediglich einen Wert, den ich der Funktion localtime() als Wert mitgeben kann.
localtime() berechnet aus jeder beliebigen Zahl ein passendes Datum, nur dass diese Zahl im Format time_t sein muss und nicht int oder double.
Also ist das einzige Problem was ich effektiv habe: Wie konvertiert man int oder uint oder double zu time_t?

Sämtliche Webseiten die ich gefunden habe beginnen jede Form von Datums- und Zeitberechnung grundsätzlich bei

time_t sometime;
time(&sometime);

Da time() eine variable im Format time_t zurück gibt funktioniert das ohne Probleme, nur dass dies IMMER die aktuelle Unixtime nimmt, ohne option hier andere Werte anzugeben.
Ich finde absolut nirgendwo, eine saubere Lösung zu:

time_t sometime = (time_t)100000;

Da gibt es nur 100te von Warnungen, dass man das so nicht machen soll, weil es nicht sicher ist, aber keiner erklärt, wie man es "sicher" machen könnte.

Zum Vergleich, was ich suche ist in PHP z.B. mit der Funktion date() gelöst.
Im Prinzip macht date() in PHP nichts anderes als localtime() in C, nur mit dem Unterschied, dass date() jeden beliebigen int wert (oder auch unix timestamp) als parameter akzeptiert, während localtime() nur time_t format akzeptiert, wobei der einzige Weg ein korrektes time_t format zu bekommen die funktion time() ist, die wiederum ausschliesslich die aktuelle Zeit verwendet und keine Option bietet einen anderen Wert als parameter mitzugeben.
Auch eine andere Funktion, ähnlich zu time(), die Parameter akzeptieren würde, wie date() in PHP gibt es in C scheinbar nicht.
 
Hi.
Es gibt 1000 Seiten im Web, die mir sagen WAS ich tun muss, aber keine einzige, die mir sagt, WIE man das macht.
Weil es nicht geht (ohne die darunterliegende Implementierung zu kennen).

Nimm boost::date_time wie von devdevil schon vorgeschlagen wurde.
Selber machen wäre mir schon lieber, vor allem weil ich es dabei lernen würde statt bei anderen abzukupfern.
Mit Datum und Zeit rumzurechnen ist nicht gerade trivial. (obwohl es bei dir wohl kaum darauf ankommt ob es korrekt funktioniert oder nicht)

Verwende lieber eine getestete Bibliothek, da sparst du dir viel Ärger.

Oder du beißt in den saueren Apfel, benutzt time_t wie einen integralen Wert und lebst damit, das dein Programm nicht mit jeder C Bibliothek funktionieren wird.

Gruß
 
Hm. Wenn er mal anständig lesen würde, würde der Herr Thomasio sein vorlautes Mundwerk halten und die gebotene Lösung nehmen. Da seine Fähigkeiten anscheinend auch nicht ausreichen um eine einfache Sec to Hour usw. umrechnung vorzunehmen, scheint die andere Lösung, es selbst schnell zu schreiben, auch nicht zu gehen.

Davon mal abgesehen das Zeitdifferenzen nicht einfach per operator- sondern per std::difftime berechnet werden.
 
Zurück