【问题标题】:C++ convert string to time_tC++ 将字符串转换为 time_t
【发布时间】:2016-06-27 17:26:26
【问题描述】:

我正在使用stat.st_mtime 获取我对目录的最后修改时间,然后将其存储到file.txt 中(存储的字符串类似于:1467035651

后来,当我从我的file.txt 检索数据时,我尝试将我的字符串从我的 file.txt 转换为 int 类型,因为该字符串只包含几秒钟,但我不知道是否这样做是个好主意。

有没有办法直接转换成time_t

【问题讨论】:

  • 读一读就可以了。
  • 请选择一种语言!
  • 对于 C++ 的副本:stackoverflow.com/q/7113396/694576
  • @alk 建议的重复限制为“这必须在 Windows xp 上运行” - 当然是 near 重复。 (这确实是编译器问题,而不是操作系统问题)这可能会阻止使用 _Generic 进行类型区分,因为该 OP 可以接受。
  • @kfsone:最好不要。

标签: c++ c time stat


【解决方案1】:

根据reference documentationtime_t 只是一个未指定的数字格式。

直接从文件中读回数值,无需特殊转换:

time_t t;
std::ifstream input("File.txt");
// ...
input >> t;

【讨论】:

  • 不错的 C++ 答案。 C 具有挑战性,因为 time_t 可能是整数或 FP。
【解决方案2】:

stdlib.h 中的函数 atoll 应该可以工作。示例:

time_t t;
char *time_string = //...

t = (time_t) atoll(time_string);

【讨论】:

  • 在特殊平台上time_t 是浮点数。 atoll(time_string) 可能会截断有效的小数位数。
  • @chux: 甚至可以是struct :-O
  • ato*() 函数容易出错,因为它们提供了一种在转换过程中检测错误的安全方法。
  • @alk time_t 必须是 真实类型(整数 FP) - 这不允许 struct
  • 由于结构stat是在C POSIX库头sys/stat.h中定义的,我认为将stat.st_mtime字符串转换为time_t值就足够了。尽管time_t 没有被 C 标准定义,但它几乎总是一个整数值。也许我的解决方案是解决这个问题的正确方法。
【解决方案3】:

有没有办法直接转换成time_t?

其他各种答案已经发布了具有优势和劣势的直接解决方案。

只包含几秒钟,但我不知道这样做是否是个好主意。

答案取决于目标。 IMO,这是错误的方法

考虑使用ISO 8601 标准,而不是将时间戳保存/读取为某种编译器相关格式,并将时间戳保存在明确表示时区的文本标准版本中,最好是通用时间。

示例 C 代码作为帖子标记为 C
对于写作,类似

// Minimum size to store a ISO 8601 date/time stamp
//YYYY-MM-DDThh:mm:ss\0
#define N (4 + 5*3 + 1 + 1)

time_t x;
struct tm *tm = gmtime(&x);
if (tm == NULL) {
  return failure;
}

char dest[N + 1];
int cnt = snprintf(dest, sizeof(dest), "%04d-%02d-%02dT%02d:%02d:%02dZ", 
    tm.tm_year + 1900, tm.tm_mon+1, tm.tm_mday,
    tm.tm_hour, tm.tm_min, tm.tm_sec);
if (cnt < 0 || cnt >= sizeof(dest)) {
  return failure;
}

小数秒需要额外的代码。
另见ftime( , , "%FT%T %z", )

您更愿意在file.txt 中阅读什么内容?

1467035651 

2016-06-27T13:54:11Z

【讨论】:

    【解决方案4】:

    [假设 C]

    strto*() 系列函数提供了将 C-“字符串”转换为整数、signedunsigned 以及 float and double 的故障安全方法。

    【讨论】:

      猜你喜欢
      • 2016-12-11
      • 2021-12-26
      • 2016-09-15
      • 2010-12-18
      • 2011-10-30
      • 2011-07-19
      • 2014-03-02
      • 2018-07-25
      • 2015-12-22
      相关资源
      最近更新 更多