计算自1970/1/1以来经过的时间(精确到毫秒)

时间:2014-11-21 01:59:15

标签: c windows

请求接受特定时间并计算自1970/01/01 00:00:00以来经过的时间 需要花费毫秒时间!

例如,输入日期时间:2009/08/06 14:35:19.42 结果显示:124958371942

据我所知,time_t只关注自1970/01/01以来经过了多少秒 和struct tm没有要设置的毫秒属性

我尝试使用mktime并得到错误的结果:1249540519ll

struct tm t;
t.tm_year = 2009 - 1900;
t.tm_mon = 7;
t.tm_mday = 6;
t.tm_hour = 14;
t.tm_min = 35;
t.tm_sec = 19;

wprintf(L"%ull\n", mktime(&t));

这种情况应该使用什么API? 谢谢!

1 个答案:

答案 0 :(得分:0)

它出现在124958371942,OP正在计算厘秒,而不是毫秒。还有一个时区问题。 1970年的时间戳似乎是UTC,而2009年的日期可能是本地的。

应对时区差异的各种方法。

comon方法是假设2009/08/06 14:35:19.42和1970/01/01 00:00:00都是世界时。另一个是他们都是当地时间。以下假定当地时间。

#include <stdio.h>
#include <time.h>

void tt(void) {

  struct tm t = { 0 }; // important to set _all_ fields

  t.tm_year = 2009 - 1900;
  t.tm_mon = 8 - 1;
  t.tm_mday = 6;
  t.tm_hour = 14;
  t.tm_min = 35;
  t.tm_sec = 19;
  t.tm_isdst = -1;  // Unless known let code determine if it is DST or not.
  time_t t1 = mktime(&t);
  printf("%10lld\n", (long long) t1);

  t.tm_year = 1970 - 1900;
  t.tm_mon = 1 - 1;
  t.tm_mday = 1;
  t.tm_hour = 0;
  t.tm_min = 0;
  t.tm_sec = 0;
  t.tm_isdst = -1;
  time_t t0 = mktime(&t);
  printf("%10lld\n", (long long) t0);

  printf("%lf\n", difftime(t1, t0) * 1000.0);
}

// Of course these are per my timezone value
1249587319
     21600
1249565719000.000000

一些细节:

struct tm() 可能有一个亚秒字段。这就是将整个结构归零的重要原因。仅指定了9个字段,其他字段可能存在。在调用tm_wday之前,不需要初始化两个字段tm_ydaymktime(),但至少应设置其中的7个字段,包括tm_isdst

difftime() 减去时间戳的便携方式。

打印time_t时,值通常自1970年以来没有闰秒的整数秒数。转换为long long合理的,但不是绝对可移植的打印方法。