【问题标题】:How do I set a C++ time_t object to the epoch?如何将 C++ time_t 对象设置为纪元?
【发布时间】:2018-10-13 04:28:38
【问题描述】:

这个问题类似于以下:

convert epoch to time_t

Converting time_t to int

但我的答案并不完整。

如果您想获取 当前 日期/时间,您可以调用 time(0)time(NULL),如以下标准示例:

// current date/time based on current system
   time_t now = time(0);

我想定义一个函数,它将返回一个 time_t 并允许客户端在发生错误时传递一个可选的默认返回值。此外,我想在那个“默认”参数上设置一个默认值。这在我拥有的库中提供了对称性,它具有跨多种语言的一对一计数器部分,因此我不打算重新设计所有这些。

我的想法是将默认返回设置为纪元。然后,客户理论上可以轻松地评估该回报,并确定一个时期的回归很可能(如果不是总是)表明它是无效的。我可以想到一些替代方案,但没有什么干净的,也符合我现有的模式。

是否有一种简短而有效的方法可以使我的函数签名具有该对象的默认值等于纪元?比如

   ...myfunc(...., const time_t &defVal=time(0) );

如果0 指的是纪元而不是当前日期/时间,那将是完美的!

【问题讨论】:

  • 使用 boost 可选或 std 可选而不是标志值。请!

标签: c++ datetime stl


【解决方案1】:

函数std::time()std::time_t 的形式返回自纪元以来的秒数。因此,要在 epoch 将 std::time_t 设置为零后找到 秒:

std::time_t t = 0;

所以你可以这样做:

void myfunc(const std::time_t& defVal = 0)

【讨论】:

  • 优秀。我不明白我可以将 std::time_t 分配给 0。这回答了我发布的问题。不过,我要让 Remy 占优势,因为他建议使用 -1,这比我原来的计划要好。
【解决方案2】:

使用0 有什么问题? (time_t)0 代表纪元本身(如果要查找实际纪元日期/时间,请将(time_t)0 传递给gmtime()localtime())。

time_t myfunc(...., time_t defVal = 0 );

或者,您可以改用(time_t)-1,这不是有效时间,因为time() 在出错时返回(time_t)-1,而time_t 表示自纪元。

time_t myfunc(...., time_t defVal = (time_t)-1 );

如果用户不提供自己的默认值,则无论哪种方式都可以为用户提供易于比较的内容。

【讨论】:

  • 谢谢!我同意你的-1建议。这比 0 好。这也愉快地编译了。
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2011-02-26
  • 2015-10-07
  • 2011-08-09
  • 1970-01-01
相关资源
最近更新 更多