Как преобразовать struct tm в time_t путем обнуления часов, например: 00:00 - PullRequest
0 голосов
/ 11 октября 2018
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независимо от установленного в структуре tm_hour tm

Заранее спасибо

1 Ответ

0 голосов
/ 11 октября 2018

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

...