【问题标题】:calculate milliseconds from the mid night计算从午夜开始的毫秒数
【发布时间】:2011-10-23 11:49:23
【问题描述】:

我需要计算从午夜开始的毫秒数,写了代码但似乎有什么问题。

 time_t t;
 time_t rawtime;
 char buff[256] ={0};
 struct timeval tv;
 struct timezone tz;
 struct tm *tma;

 gettimeofday(&tv, &tz);
 tma=localtime(&tv.tv_sec);
 static char* months[] = {"JAN", "FEB", "MAR", "APR", "MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"};
 sprintf(buff,"%02d %s %d 00:00:00",tma->tm_mday, months[tma->tm_mon], tma->tm_year + 1900);

 struct tm tm1;
 strptime(buff, "%d %b %Y %H:%M:%S", &tm1);
 tm1.tm_isdst = -1;
 t = mktime(&tm1);
 time ( &rawtime );

time_t milSecFromMidNight = (rawtime  - t)*1000 +  tv.tv_usec/1000;

似乎有些时间以毫秒为单位存在差异。谁能指出来?

【问题讨论】:

  • 当你说差异时,你看到了什么问题?
  • 有时它的毫秒数低于预期

标签: c++ c unix unix-timestamp


【解决方案1】:

您需要正确计算上一个午夜,即当天开始的午夜,作为 time_t。你可以这样做:

// function to calculate midnite last night

time_t  // calc current day 00:00:00
today_at_0000 ( ) {
  time_t curtime, midtime;
  struct tm *localtm_p;
  curtime = time( NULL );
  localtm_p = localtime( &curtime );
  localtm_p->tm_hour = 0;
  localtm_p->tm_min = 0;
  localtm_p->tm_sec = 0;
  midtime = mktime( localtm_p ); // today at 00:00:00
  return midtime;
}

重要的一点是,在将当前时间的 tm_hour、tm_min 和 tm_sec 设置为零后,您必须使用 mktime() 来查找午夜。

找到午夜的 time_t 后,您就知道该做什么了。

【讨论】:

  • 我正在查看毫秒而不是秒。
  • @CrazyC -- 哇,太难了!你当然知道如何提出挑战。我得考虑一下。哦耶!现在我记得:毫秒 = 秒 * 1000。唷!不要再问这些令人费解的问题了——所有这些想法都让我头疼:-)
  • 我正在精确地以毫秒为单位查看时间。如果我将秒转换为毫秒,那么将丢失毫秒。让我们假设,我正在获取时间的那一刻是 2:30:07:499(h:mm:ss:millisecond),根据建议的解决方案,我将失去 499 毫秒。希望你明白了:)
  • 哦,我明白了,谢谢。当您计算午夜的 time_t 时,会考虑到这一点。午夜是小时 0,分钟 0,秒 0,毫秒 0 是 0:0:0:0,对吗?换句话说,当您形成午夜的 time_t 时,您只对一天的开始感兴趣;小时、分钟、秒和毫秒不是计算的一部分——它们被丢弃,设置为零——所以你不会丢失任何东西。
  • 能否请您发布代码? struct tm 在毫秒内没有任何成员变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2012-08-12
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多