【问题标题】:c++ convert time_t to string and back againc ++将time_t转换为字符串并再次返回
【发布时间】:2011-10-30 02:45:27
【问题描述】:

我想将 time_t 转换为字符串然后再转换回来。
我想使用 ctime() 将时间转换为字符串。
我似乎在谷歌或 time.h 头文件上找不到任何东西,有什么想法吗?
基本上我要做的是将日期存储在文件中,然后将其读回,以便我可以再次将其用作 time_t 。
此外,在 std,mfc 之外没有库引用。
还要注意,这必须在 Windows xp 及更高版本上运行,仅此而已。

编辑

我要做的就是将 time_t 转换为字符串(我不在乎它是否可读),然后将其转换回 time_t。我基本上只是试图将 time_t 存储到一个文件中并再次读取它(但我不想要任何代码,因为除了 time_t 之外文件中还有更多信息)。

【问题讨论】:

  • 你想要一个人类可读的字符串,比如“2011-08-18 21:07:10”吗?
  • 我很惊讶这里没有任何超过 0 的东西,它们都是很好的答案。

标签: c++ time


【解决方案1】:

您必须编写自己的函数才能做到这一点。这些函数将任何原始类型(或任何重载 operator> 的类型)转换为字符串,反之亦然:

template<typename T>
std::string StringUtils::toString(const T &t) {
    std::ostringstream oss;
    oss << t;
    return oss.str();
}

template<typename T>
T StringUtils::fromString( const std::string& s ) {
    std::istringstream stream( s );
    T t;
    stream >> t;
    return t;
}

【讨论】:

  • 我最初的回答只是第一句话,我认为反对意见是在我添加代码的编辑之前
  • 嗯,好的。这会涵盖我在上面发布的编辑吗?
  • @kelton52:是的。如果需要写入二进制文件,可以将 .c_str() 与生成的字符串一起使用
  • 感谢遮阳篷,效果很好。我不得不做一些从 wchar_t 到 char 的转换,但这就是我为别人的项目工作所得到的:p。无论如何,它很简单而且效果很好。
【解决方案2】:

ctime() 返回一个指向使用特定格式的字符缓冲区的指针。您可以使用sprintf() 将这样的字符串解析为其各个部分,将它们存储在struct tm 中,然后使用mktime() 将其转换为time_t

【讨论】:

    【解决方案3】:

    time_t Wikipedia article 文章对此有所了解。底线是 C 规范中不保证 time_t 的类型。以下是您可以尝试的示例:

    试试stringstream

    #include <string>
    #include <sstream>
    
    time_t seconds;
    time(&seconds);
    
    std::stringstream ss;
    ss << seconds;
    std::string ts = ss.str();
    

    Boost 的 lexical_cast 是对上述技术的一个很好的封装:

    #include <boost/lexical_cast.hpp>
    #include <string>
    
    time_t t;
    time(&t);
    
    std::string ts = boost::lexical_cast<std::string>(seconds);
    

    time_t 上的维基百科:

    time_t 数据类型是 为存储而定义的 ISO C 库 系统时间值。这些值是 从标准返回time() 库函数。这种类型是 标准中定义的 typedef 标题。 ISO C 定义 time_t 作为算术类型,但确实 不指定任何特定类型, 范围、分辨率或编码。 也未指定的含义是 应用于时间的算术运算 价值观。

    Unix 和 POSIX 兼容系统将 time_t 类型实现为 signed integer(通常为 32 或 64 位宽) 代表秒数 自 Unix 时代开始: UTC 时间 1970 年 1 月 1 日午夜(不是 计算闰秒)。一些系统 正确处理负时间值, 而其他人则没有。系统使用 32位time_t类型易受 Year 2038 problem

    【讨论】:

    • 请阅读我的帖子。问题不是将其转换为字符串,而是将其转换回来,这就是我找不到任何信息的地方。
    • @kelton:Int 到 String 非常简单。您将不得不扩展您的要求。
    • 好的,我真正需要做的就是将 time_t 转换为任何类型的字符串,然后再返回。我真的不在乎它是否是人类可读的,我只想将它存储在一个文件中。
    • @kelton:然后使用atoi() 转换回std::string time.c_str()
    【解决方案4】:

    使用gmtime() 将time_t 转换为struct tm,然后使用strftime() 将struct tm 转换为纯文本(最好是ISO 8601 格式)。结果将是可移植的、人类可读的和机器可读的。

    要返回 time_t,您只需将字符串解析回 struct tm 并使用mktime()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-19
      • 2013-02-18
      • 2011-01-13
      • 2016-12-11
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2012-11-01
      相关资源
      最近更新 更多