2017-04-07 163 views
1

目標是一個函數,它將int(或long)與實際時間一起傳遞。 我爲此將本地時間寫入一個字符串(據我瞭解),並嘗試將它與atoi/atol轉換爲我的int/long。但不知何故,我沒有得到預期的結果。將字符串從strftime轉換爲int/long

事情我已經嘗試:

  • 我從最初的INT切換到長。
  • 我改變了我的字符串的大小。如果我將它調整爲7而不是我需要的15個字節,它至少會轉換我的字符串的日期部分。但我需要一切。

我有下面的代碼:

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; 
} 

在響應中得到的:

實際時間:20170407091221 轉化時間:1240669205

我希望這很容易理解,並提前感謝大家的幫助!

+0

你應該轉換代碼,以英語之前發佈您的問題。用戶可以更好地幫助你,如果明白你寫的是什麼... – LPs

+0

你想以時間戳格式返回時間嗎?作爲整數值返回20170407091221是沒有意義的。 –

+0

謝謝你指出。我改變了它。 – Mathias

回答

1

atol將字符串轉換成long而你的情況可能是32位,因此無法容納值20170407091221。您的值124066920520170407091221的低32位。

您可以方便地查看與例如calc.exe在Windows上:
20170407091221爲十六進制:1258 49F3 1C15
1240669205爲十六進制:49F3 1C15

+0

這就是我所害怕的。有什麼方法可以改變限制嗎? – Mathias

+0

@MathiasWoellm爲64位編譯它可能會工作 - 它會在Mac OS上。或者使用'long long'和[strtoll()](https://linux.die.net/man/3/strtoll) – JeremyP

3

不能使用長來存儲這些數據:爲最大值signed long是:

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

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

您可以使用unit64_t做你需要什麼

#include <stdint.h> 

[...] 

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