UNIX timestamp in Windows



  • Hallo, kann mir evtl. jemand sagen, wie ich in meinem Code an den aktuellen UNIX timestamp komme? Dabei handelt es sich übrigens um die anzahl der sekunden seit 1.1.1970 00:00. Im Endeffekt kommt dabei eine 10 stellige Zahl raus.

    flo



  • Etwa so (ungetestet):

    time_t now = time(NULL);
    std::cout << now << std::endl;
    


  • Original erstellt von virtual:
    **

    std::cout
    

    **

    Uh, oh, das wird Ärger geben.

    was ein time_t ist, und was er enthalten soll verrät die ISO-Norm eher nicht. Wirklich portabel wird's höchstens dann, wenn Du mit Struktur tm das gewünschte Unix-Datum (1.1.1970) eingibst, das mit mktime in einen time_t verwandelst um damit zu Arbeiten.



  • Original erstellt von Daniel E.:
    Uh, oh, das wird Ärger geben.

    Oh, seh ich ein, ja. :). Hatte garnicht so recht kapiert, daß ich mich im ANSI C Forum befinde, als ich die Frage beantwortete.



  • Hm, und wie kann ich ein time_t mit einem char* vergleichen?



  • Genauso wie du Äpfel mit Birnen vergleichst.



  • :p und wie caste ich einen time_t nach char*?



  • (char*)t ...

    Glaube aber kaum dass dir das hilft. Was willst du wirklich?



  • Einen Timestamp, den ich aus einer Datei ausgelesen habe (habe ihn also als char*) mit dem momentanen vergleichen.



  • time_t now = time(NULL);
    char bla[10];
    strcpy(bla, (char*)now);
    MessageBox(NULL, bla, bla, MB_OKCANCEL);
    

    Hm, warum geht das denn nicht?

    n00b



  • Anmerkung: Der Unix-Timestamp zählt erst ab ein Uhr

    Gruß Jens



  • Original erstellt von <n00b>:
    *```
    strcpy(bla, (char
    )now);

    das ist ungefähr so wie im porzellanladen autofahren...
    wenn du einen int nach char* castet dann wird der wert des integer als pointer interpretiert und versucht darauf zuzugreiffen....

    ich denke mit:

    atoi(bla)==now
    sollte das gehen...
    aber ausserdem wenn du einfach strcpy(....); schreibst dann passiert garnichts weil du die strings zwar vergleichst aber garnichts damit machst... irgendwo muss da noch ein if hin oder so:

    time_t now = time(NULL);
    char bla[10];
    if(atoi(bla)==now)
       MessageBox(NULL, bla, bla, MB_OKCANCEL);
    

    geht aber wie gesagt auch nur wenns sich time_t implizit auf int casten lässt



  • Hm, und wie kopiere ich einen Timestamp denn nun in einen char*. Das muss doch irgendwie möglich sein. Ich möchte doch nur das aktuelle Datum in einem char* haben. Mehr nicht!



  • Unter der Voraussetzung, dass das gleiche System mit den gleichen Einstellungen den 'Timestamp' in seinem Spezialformat (das natürlich nicht festgelegt ist) in die Datei geschrieben hat, liest Du es einfach mit fgets, fgetc, oder sonstwas aus der Datei (man kann mit Standard-C keinen time_t in eine Datei schreiben, weil nicht bekannt ist, welcher Typ sich dahinter versteckt). Dann kannst Du den time_t von oben (siehe erstes Post von mir) zB mit ctime ebenfalls nach char* konvertieren und dann mit strcpy oder von Hand vergleichen. Damit tut man sich aber schwer Berechnungen durchzuführen. Für eine einfache Differenzbestimmung kann man difftime benutzten, das zwei time_ts verlang, in komplexeren Fällen nimmt man besser zwei struct tms und operiert auf diesen Daten.



  • Hm, okay, mit

    char *timenow;
    time_t now = time(NULL);
    timenow = ctime(&now);
    

    kann ich das Datum im Format "Sun Apr 20 ..." in eine Datei schreiben. Ich möchte jedoch den Timestamp selbst in die Datei schreiben (also die 10stellige Zahl). Wie geht das?

    Danke für eure Hilfe!



  • Überhaupt nicht schön. Man muss herausfinden ob time_t ein Kommatyp oder ein Ganzzahlentyp ist und dann entsprechend mit printf ausgeben:

    void print_time_t(time_t time, FILE *f)
    {
        long double d;
        time_t t;
    
        d = 1.5;
        t = d;
        if ((long double)t == d) { /* is long double */
            fprintf(f, "%Lg", (long double)time);
        } else {                                    /* long long */
            fprintf(f, "%ll", (long long)time);
        }
    }
    

    ;). Der normale Ansatz ist es aber, so etwas festzulegen (Makefile, config.h ...) oder direkt die Finger von solchem Zeug zu lassen.



  • pfui 🙄


Anmelden zum Antworten