【问题标题】:time in C++ calculationC++ 计算中的时间
【发布时间】:2011-08-03 00:36:13
【问题描述】:

我有一个包含记录的文本文件。我需要确定时间(这是记录结构的一部分)是否在代表上下限的 2 倍(存储在字符串中)之间。 在文件中,时间以 145540123456 表示,这意味着 14 是小时,55 - 分钟,40 - 秒,123456 - 精确到微秒。

我决定它是否在范围内的上限和下限时间,我将它作为相同格式的字符串获取,例如“093000000000”。怎么计算,需要用time_t和time library吗?

注意:我不能使用 Boost。

【问题讨论】:

  • 将数字转换为long long 并进行比较(只要范围不跨越多天,这将起作用。)
  • 您可以对字符串值(上限、下限和记录时间)进行排序,因为您的格式使它们完全按字母顺序排序。如果记录时间是顺序的第一个或最后一个,则超出范围。一个警告是时间都应该在同一天。
  • 你确定我可以使用字符串比较来比较逻辑时间吗?我不能得到不正确的时间顺序吗?

标签: c++ windows unix time


【解决方案1】:

如果您不减去这些数字,您应该能够将它们作为数字进行比较。代表更长时间的那个也总是一个更大的数字。这是因为您有最重的单位在左端(小时)和最轻的单位在右端(微秒),这与正常数字使用的系统相同。

只需将其转换为 unsigned int64 或其他内容,而不仅仅是 int,因为它会被 145540123456 之类的数字溢出。

【讨论】:

  • 你确定我可以使用字符串比较来比较逻辑时间吗?我不能得到不正确的时间顺序吗?
  • 鉴于您提供的格式,这是不可能的。试着想一个两次发生这种情况的例子,你就会明白我的意思了。
【解决方案2】:

在这种情况下,只需将其转换为数字并进行比较即可。您的格式将最重要的数字放在左侧。您的最大可能数字是235,959,999,999,它不适合无符号长整数。

一种简单的方法是将其拆分为 HHMMSS 和 mmmmmm -- 如果第一个数字相等,则比较第二个。

【讨论】:

    【解决方案3】:

    在 C++ 中处理日期/时间计算的最佳方法 (c) 是 Boost.Date_Time 库。

    很遗憾,您的字符串不是任何标准格式。因此,您必须自己解析它们并将其用作 posix 持续时间的输入。

    如果你不能使用任何库,你可以简单地定义一个带有小时、分钟、秒和微秒成员的结构和operator<。 然后只需将输入解析为这些结构并进行比较。

    另一个选项是以微秒为单位转换每个持续时间。这样比较就变得微不足道了。

    【讨论】:

    • 这真的取决于他是否想在他的应用程序中进一步使用时间,或者这只是一次检查。在某一时刻,他可能想打印一些东西,所以他必须解析它等等。
    【解决方案4】:

    您指定的格式具有简单的优点,即按字母数字对这些时间字符串进行排序将使它们保持正确的顺序。

    因此,使用strcmp(如果使用以空字符结尾的 char * 缓冲区,则为简单的 C 函数)或std::string 的比较运算符可以让您轻松确定某个时间字符串是否属于某个区间。

    这些方法可以导致很少的计算,例如,如果您比较的字符串的第一个字符不同,因为标准函数应该足够聪明,一旦确定结果就停止比较字符串。

    【讨论】:

    • 你确定我可以使用字符串比较来比较逻辑时间吗?我不能得到不正确的时间顺序吗?
    • 只要小时总是以 0 为前缀,它就可以工作,正如你所指出的那样。
    猜你喜欢
    • 2019-09-04
    • 2016-02-02
    • 2012-08-14
    • 1970-01-01
    • 2011-08-04
    • 2010-10-26
    • 2010-09-05
    相关资源
    最近更新 更多