从1970年1月1日起,如何用c语言获取UTCTime(毫秒)

从1970年1月1日起,如何用c语言获取UTCTime(毫秒),c,time.h,C,Time.h,有没有办法用c语言中的time.h获得1970年的毫秒及其分数部分?是自您提到的纪元以来的秒数 的答案是正确的:只需将Unix时间戳乘以1000即可得到毫秒 请注意,依赖Unix时间戳返回的所有毫秒值都将是1000的倍数(如1234567800)。分辨率仍然只有1秒 你不能得到分数部分 帕维尔的评论也是正确的。Unix时间戳不考虑闰秒。这使得依赖毫秒的转换更加不明智。对于Unix和Linux,您可以使用 对于Win32,您可以使用,然后将其转换为时间\u t+毫秒: void FileTimeT

有没有办法用c语言中的time.h获得1970年的毫秒及其分数部分?

是自您提到的纪元以来的秒数

的答案是正确的:只需将Unix时间戳乘以1000即可得到毫秒

请注意,依赖Unix时间戳返回的所有毫秒值都将是1000的倍数(如1234567800)。分辨率仍然只有1秒


你不能得到分数部分


帕维尔的评论也是正确的。Unix时间戳不考虑闰秒。这使得依赖毫秒的转换更加不明智。

对于Unix和Linux,您可以使用

对于Win32,您可以使用,然后将其转换为时间\u t+毫秒:

void FileTimeToUnixTime(FILETIME ft, time_t* t, int* ms)
{
  LONGLONG ll = ft.dwLowDateTime | (static_cast<LONGLONG>(ft.dwHighDateTime) << 32);
  ll -= 116444736000000000;
  *ms = (ll % 10000000) / 10000;
  ll /= 10000000;
  *t = static_cast<time_t>(ll);
}
void FileTimeToUnixTime(FILETIME ft、time\t*t、int*ms)
{

LONGLONG ll=ft.dwLowDateTime |(static_cast(ft.dwHighDateTime)它不是标准的C,但在SysV和BSD派生的系统中都存在
gettimeofday()
,并且在POSIX中。它在
struct timeval
中返回自历元以来的时间:

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

如果需要毫秒分辨率,可以在Posix中使用gettimeofday()

#包括
...
结构timeval-tp;
gettimeofday(&tp);
长整数ms=tp.tv_sec*1000+tp.tv_usec/1000;

这在Ubuntu Linux上有效:

#include <sys/time.h>

...

struct timeval tv;

gettimeofday(&tv, NULL);

unsigned long long millisecondsSinceEpoch =
    (unsigned long long)(tv.tv_sec) * 1000 +
    (unsigned long long)(tv.tv_usec) / 1000;

printf("%llu\n", millisecondsSinceEpoch);
#包括
...
结构时间值电视;
gettimeofday(&tv,NULL);
无符号长毫秒新纪元=
(未签名长-长)(tv.tv_秒)*1000+
(未签名的long-long)(tv.tv_-usec)/1000;
printf(“%llu\n”,毫秒);
在撰写本文时,上面的printf()为我提供了1338850197035。您可以在网站上进行健全性检查,在那里输入值以获取等效的人类可读时间(尽管没有毫秒精度)。

//系统时间
系统时间系统时间;
GetSystemTime(&systemTime);
//当前文件时间
文件时间文件时间;
SystemTimeToFileTime(&systemTime,&fileTime);
//100纳秒分辨率的文件时间
ULONGLONG文件时间纳米100;

fileTimeNano100=((ULONGLONG)fileTime.dwHighDateTime)你不能以独立于平台的方式获取分数部分。你关注的是哪个平台?我遵循ANSI C的标准,因此我的应用程序将独立于平台。目前我在Windows平台上。任何其他可以获取精确毫秒(包括分数部分)的库?Unix时间戳与fundamen差不多好吧。一定是Unix的设计者认为一秒钟的分辨率就足够了。然后,维护1ms分辨率的开销可能超出了早期Unix系统。gettimeofday()做需要做的事情。下面是一个代码示例:那么一个人试图支持什么操作系统?第一个链接已失效。@因此,请引用(或总结)您包含的任何链接的相关段落。第二个链接已失效。它可能应该是
gettimeofday(&tv,NULL)
答案中的链接已失效。域不存在。您的答案似乎严重依赖于特定的操作系统/环境(非POSIX环境如何?),并且缺少上下文。例如,POSIX cstdlib没有为其指定的任何数据类型使用所有大写类型名称——这些数据类型必须在别处定义。您似乎正在使用库。可以这样说:“这个答案适用于具有Y库的X类系统,但我不确定如何使用Z系统”,但像这样只使用代码的答案几乎没有用处
#include <sys/time.h>

...

struct timeval tv;

gettimeofday(&tv, NULL);

unsigned long long millisecondsSinceEpoch =
    (unsigned long long)(tv.tv_sec) * 1000 +
    (unsigned long long)(tv.tv_usec) / 1000;

printf("%llu\n", millisecondsSinceEpoch);
    // the system time
    SYSTEMTIME systemTime;
    GetSystemTime( &systemTime );

    // the current file time
    FILETIME fileTime;
    SystemTimeToFileTime( &systemTime, &fileTime );

    // filetime in 100 nanosecond resolution
    ULONGLONG fileTimeNano100;
    fileTimeNano100 = (((ULONGLONG) fileTime.dwHighDateTime) << 32) + fileTime.dwLowDateTime;

    //to milliseconds and unix windows epoche offset removed
    ULONGLONG posixTime = fileTimeNano100/10000 - 11644473600000;
    return posixTime;