Чтобы сгенерировать метку времени 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
.