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

时间:2018-10-11 17:15:13

标签: c date datetime time time.h

struct tm t;
mktime(&t)

这将返回类似1199246400-> Tue Jan 1 02:00:00 2008

的内容

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

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

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

更明显的是tm_hour不断变化

所以我需要它始终返回date + 00:00:00而不管struct tm中设置的tm_hour为何

提前谢谢

1 个答案:

答案 0 :(得分:1)

要在当地时间今天凌晨生成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