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为何
提前谢谢
答案 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
设为零。gmtime()
而不是localtime()
。如果要舍入(tm_hour >= 12
映射为明天午夜而不是今天午夜),则必须测试设置。但是请注意,mktime()
规范了tm_year
,tm_mon
,tm_day
,tm_hour
,tm_min
,tm_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
。