如何计算从今天开始以来的秒数?

时间:2010-03-06 13:54:41

标签: c++ time

我想得到午夜以来的秒数。

这是我的第一个猜测:

  time_t current;
  time(&current);
  struct tm dateDetails;
  ACE_OS::localtime_r(&current, &dateDetails);

  // Get the current session start time
  const time_t yearToTime     = dateDetails.tm_year - 70; // year to 1900 converted into year to 1970
  const time_t ydayToTime     = dateDetails.tm_yday;
  const time_t midnightTime   = (yearToTime * 365 * 24 * 60 * 60) + (ydayToTime* 24 * 60 * 60);
  StartTime_                  = static_cast<long>(current - midnightTime);

4 个答案:

答案 0 :(得分:12)

您可以使用标准C API:

  1. 获取time()
  2. 的当前时间
  3. 使用struct tmgmtime_r()将其转换为localtime_r()
  4. 将其tm_sectm_mintm_hour设置为零。
  5. 使用time_t将其转换回mktime()
  6. 找出原始time_t值与新值之间的差异。
  7. 示例:

    #include <time.h>
    #include <stdio.h>
    
    time_t
    day_seconds() {
        time_t t1, t2;
        struct tm tms;
        time(&t1);
        localtime_r(&t1, &tms);
        tms.tm_hour = 0;
        tms.tm_min = 0;
        tms.tm_sec = 0;
        t2 = mktime(&tms);
        return t1 - t2;
    }
    
    int
    main() {
        printf("seconds since the beginning of the day: %lu\n", day_seconds());
        return 0;
    }
    

答案 1 :(得分:4)

一天中的秒数也是一个模数:

 return nbOfSecondsSince1970 % (24 * 60 * 60)

答案 2 :(得分:1)

这是另一种可能的解决方案:

    time_t stamp=time(NULL);
struct tm* diferencia=localtime(&stamp);
cout << diferencia->tm_hour*3600;

我认为更简单,我尝试了上面的解决方案,但它在VS2008中无效。

P.S。:对不起我的英语。

编辑:这将输出始终相同的数字,因为它只乘以小时数 - 所以如果它的2:00 AM将始终输出7200.请改为使用:

time_t stamp=time(NULL);
struct tm* diferencia=localtime(&stamp);
cout << ((diferencia->tm_hour*3600)+(diferencia->tm_min*60)+(diferencia->tm_sec));

答案 3 :(得分:1)

即使在 11 年后,仍有一些改进:

  • 改进了 DST 处理

  • 错误检查

  • 适当的time_t减法

代码:

#include <ctime>

// Error: return -1
// Success: return [0 ... 90,000) (not 86,400 due to DST)
double seconds_since_local_midnight() {
  time_t now;
  if (time(&now) == -1) {
    return -1;
  }
  struct tm timestamp;
  if (localtime_r(&now, &timestamp) == 0) { // C23
    return -1;
  }
  timestamp.tm_isdst = -1; // Important
  timestamp.tm_hour = 0;
  timestamp.tm_min = 0;
  timestamp.tm_sec = 0;
  time_t midnight = mktime(&timestamp);
  if (midnight == -1) {
    return -1;
  }
  return difftime(now, midnight);
}

其他答案的失败: