如何通过将小时数归零将 struct tm 转换为 time_t:00:00

How to convert struct tm to time_t by zeroing the hours ex: 00:00

struct tm t;
mktime(&t)

这 return 类似于 1199246400 -> Tue Jan 1 02:00:00 2008

但我需要取回它 1199160000 -> Tue Jan 1 00:00:00 2008(现在是午夜)

如果我总是 returned 1199160000 -> Tue Jan 1 00:00:00 2008

我可以用mktime(&t) - 60 * 120

更明显tm_hour不断变化

所以我需要它总是 return date + 00:00:00 而不管在 struct tm

中设置 tm_hour

提前致谢

要在当地时间今天开始的午夜生成 Unix 时间戳:

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

int main(void)
{
    time_t now = time(0);
    struct tm *lt = localtime(&now);
    lt->tm_hour = 0;
    lt->tm_min = 0;
    lt->tm_sec = 0;
    time_t midnight = mktime(lt);
    printf("%ld\n", (long)midnight);
    return 0;
}

输出(在 2018-10-11 10:43 -07:00):

1539241200

随机时间转换实用程序:

$ timestamp 1539241200
1539241200 = Thu Oct 11 00:00:00 2018
$
  • 如果您不想要当地时间午夜,而是当前时间,请不要将 tm_hour.
  • 如果您需要 UTC,请使用 gmtime() 而不是 localtime()。如果要舍入(tm_hour >= 12 映射到明天午夜而不是今天午夜),则必须测试要设置的内容。但是请注意,mktime() 规范化了 tm_yeartm_montm_daytm_hourtm_mintm_sec 中的值 —所以你可以简单地使用 lt->tm_day++; 切换到明天,即使在一个月结束时它也会正确转换(所以它不是很难四舍五入 - 你只需要编码条件:if (lt->tm_hour >= 12) lt->tm_day++; 之前将 lt->tm_hour 设置为零)。
  • 如果你想处理任意时间,将值作为命令行参数(默认为 time(0) 当没有传递参数时),转换为 time_t (可能通过 strtoll() 和一个 long long 变量),然后将其传递给一个函数,该函数完成其余的转换和打印。

我们可以讨论格式化为 long 并转换为 long 是否最好;使用 long long 甚至 intmax_t.

可能会更好