【问题标题】:create unix timestamp before 1970 on windows using mktime in c在 c 中使用 mktime 在 Windows 上创建 1970 年之前的 unix 时间戳
【发布时间】:2018-07-21 02:15:54
【问题描述】:

使用c 我想使用Visual Studio(或者最好同时使用VSGCC)为1970 之前的日期创建一个unix 时间戳。时间戳应该从日期部分创建。据我所知,Visual Studio 不支持 1970 之前的时间,无论它们是 32 还是 64 bit ...

struct tm s_time = {0};
s_time.tm_year = 1940-1900;
s_time.tm_mon = 7 - 1;
s_time.tm_mday = 4;
time_t unix_time = mktime(&s_time);

【问题讨论】:

  • 你能告诉我们更多关于你想要达到的目标吗?即为什么你需要1970之前的日期以及你将如何使用它们?
  • 我很确定,在 Windows 上,您将不得不放弃基于 CRT 的时间解决方案,而必须使用本机时间结构(FILETIME 或 SYSTEMTIME)和相关的 API。
  • @AndyJ:请不要将文本中的每个名称或数据都格式化为代码。代码markdown是给code用的,不强调(也不需要强调名字等)
  • @SornelHaetir 我不确定你所说的 CRT 是什么意思,但我想我同意你所说的,只是刚接触 C 中的日期和时间我想确保我理解Visual Studio 不支持我认为相当标准的东西的情况是正确的。话虽如此,我认为您可以通过本地调用以某种方式伪造它...
  • @AndyJ 目标是有一个数字用于与其他日期时间(发生在 1970 年之前和之后)进行比较。分钟级分辨率就足够了。显然,可以对结构本身进行比较,我只是更喜欢使用单个数字。当我键入此内容时,我意识到我可以做一些掩蔽,但我的一部分仍然想知道出于一般知识目的而提出的确切问题的答案,因为我很惊讶没有一个我错过的简单解决方案。

标签: c unix-timestamp


【解决方案1】:

我想出的解决方案如下:

#include <windows.h>

#define WINDOWS_TICK 10000000
#define SEC_TO_UNIX_EPOCH 11644473600LL

int64_t date_to_int(SYSTEMTIME *s){

    FILETIME   f;

    SystemTimeToFileTime( s, &f );

    uint64_t temp_result;

    temp_result = (((uint64_t) f.dwHighDateTime) << 32) + f.dwLowDateTime;

    return (int64_t) ((temp_result/ WINDOWS_TICK) - SEC_TO_UNIX_EPOCH);    
}

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多