2017-04-07 159 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);