如何通过将小时数归零将 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_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
.
可能会更好
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
提前致谢
要在当地时间今天开始的午夜生成 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_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
.