Ich arbeite an einem Client-Server-Anwendung (unter Linux ausgeführt werden), und einer der Frames, die ich senden, enthalten einen Zeitstempel (dh der Zeitpunkt, zu dem der Rahmen gesendet wird).UTC Timestamp Vergleich
Um meine Anwendung zuverlässig zu machen, habe ich gmtime
verwendet, um die Zeit auf dem Client zu produzieren. Ich bin in Belgien, also ist die Stunde der Client-VM jetzt 2 Stunden später als die UTC-Zeit (wegen der Sommerstunde).
Auf der Serverseite, zuerst konvertiere ich die empfangene Zeichenfolge in einen time_t
Typ. Ich tue dies, um die difftime
Funktion zu verwenden, um zu sehen, ob der Zeitstempel nicht zu alt ist. Dann erzeuge ich einen Zeitstempel (in UTC-Zeit) erneut mit gmtime
, und ich konvertiere es in eine time_t
.
Ich vergleiche dann die beiden time_t
, um den Zeitunterschied zu sehen.
Ich habe ein Problem mit der Umwandlung der Zeit auf der Serverseite. Ich verwende den gleichen Code wie in dem Client, aber das ausgegebene gmtime
ist anders ...
Client-Seite: Funktion den Zeitstempel zu erzeugen und exportieren es in einen String (time_str
):
std::string getTime()
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime); // Get time of the system
timeinfo = gmtime(&rawtime); // Convert it to UTC time
strftime(buffer,80,"%d-%m-%Y %H:%M:%S",timeinfo);
std::string time_str(buffer); // Cast it into a string
cout<<"Time Stamp now (client) : "<<time_str<<endl;
return time_str;
}
Und es produices dies (bei 9h33 Ortszeit):
Zeit S stampfen jetzt: 06-04-2016 07:33:30
Server Side: fucntion den Zeitstempel abzurufen, die NEWX Zeitstempel erzeugen, und vergleichen sie:
bool checkTimeStamp(std::string TimsStamp_str, double delay)
{
cout<<"TimeStamp recieved: "<<TimsStamp_str<<endl;
/* Construct tm from string */
struct tm TimeStampRecu;
strptime(TimsStamp_str.c_str(), "%d-%m-%Y %I:%M:%S", &TimeStampRecu);
time_t t_old = mktime(&TimeStampRecu);
/* Generate New TimeStamp */
time_t rawtime;
struct tm * timeinfo;
time (&rawtime); // Get time of the system
timeinfo = gmtime(&rawtime); // convert it to UTC time_t
time_t t2 = mktime(timeinfo); // Re-Cast it to timt_t struct
/* Convert it into string (for output) */
char buffer[80];
strftime(buffer,80,"%d-%m-%Y %H:%M:%S",timeinfo);
std::string time_str(buffer); // Cast it into a string
cout<<"Time Stamp now (server) : "<<time_str<<endl;
/* Comparison */
double diffSecs = difftime(t2, t_old);
cout<<diffSecs<<endl;
bool isTimeStampOK;
if (diffSecs < delay)
isTimeStampOK = true;
else
isTimeStampOK = false;
return isTimeStampOK;
}
und es ergibt dies (bei 9h33 in Belgien):
Timestamp erhielt: 06-04-2016 07:33:30
Time Stamp jetzt (Server): 06-04-2016 08:33:31
Warum ist die Serverzeit (8h33) weder in Lokalzeit (9h33), weder in der UTC-Zeit (7h33)?
Habe ich einen Fehler in seiner Generation gemacht? Ich verstehe nicht, wo, denn das sind die gleichen Code wie auf der Client-Seite ...
Ich habe vergessen zu erwähnen, dass die beiden VMs zur lokalen Zeit, CentOS laufen. – EisenHeim