2017-04-07 5 views
1

Das Ziel ist eine Funktion, die einen int (oder long) mit der tatsächlichen Zeit liefert. Ich schreibe daher die localtime in eine Zeichenkette (soweit ich das verstanden habe) und versuche sie mit atoi/atol in mein int/long zu konvertieren. Aber irgendwie bekomme ich nicht das erwartete Ergebnis.String aus strftime in int/long konvertieren

Dinge, die ich habe versucht:

  • ich von der anfänglichen int zu lange eingeschaltet.
  • Ich habe die Größe meiner Zeichenfolge geändert. Wenn ich die Größe auf 7 statt meiner benötigten 15 Bytes verändere, konvertiert es mindestens den Datumsteil meiner Zeichenkette. Aber ich brauche alles.

Ich habe den folgenden Code bekam:

long generate_time() 
{  
    time_t time1; 
    time(&time1); 

    char time_str[15]; 
    long act_time; 

    strftime(time_str, 15, "%Y%m%d%H%M%S", localtime(&time1)); 
    printf("Actual time: %s\n", time_str); 

    act_time = atol(time_str); 
    printf("Transformed time: %d\n", act_time); 

    return act_time; 
} 

in der Antwort Resultierende:

Tatsächliche Zeit: 20170407091221 Transformed Zeit: 1240669205

ich diese Hoffnung ist einfach zu sortieren und danke Ihnen allen für Ihre Hilfe im Voraus!

+0

Sie sollten Ihren Code zu Englisch übersetzen, bevor Sie Ihre Frage zu stellen. Benutzer können Ihnen besser helfen, wenn Sie verstehen, was Sie geschrieben haben ... – LPs

+0

Möchten Sie die Zeit im Timestamp-Format so lange zurückgeben? die Rückgabe von 20170407091221 als Integer-Wert macht keinen Sinn. –

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Ich habe es geändert. – Mathias

Antwort

1

atol konvertiert eine Zeichenfolge in eine long, die in Ihrem Fall wahrscheinlich 32 Bit ist und daher den Wert 20170407091221 nicht halten kann. Ihr Wert 1240669205 ist die unteren 32 Bits von 20170407091221.

Sie können ganz einfach, dass der Check mit zum Beispiel calc.exe unter Windows:
20170407091221 als hex: 1258 49F3 1C15
1240669205 als hex: 49F3 1C15

+0

Das war, wovor ich Angst hatte. Gibt es eine Möglichkeit, die Beschränkung zu ändern? – Mathias

+0

@MathiasWoellm kompilieren es für 64 Bit könnte funktionieren - es würde auf Mac OS. Oder benutze 'long long' und [strtoll()] (https://linux.die.net/man/3/strtoll) – JeremyP

3

Sie können nicht lange benutzen solche Daten zu speichern: max-Wert für signed long ist:

-2^31+1 to +2^31-1 

oder

-2,147,483,648 to 2,147,483,647 

können Sie unit64_t verwenden zu tun, was Sie brauchen

#include <stdint.h> 

[...] 

uint64_t act_time = strtoll(time_str, NULL, 10);