Количество секунд с полуночи - PullRequest
6 голосов
/ 17 апреля 2020

Я написал приведенный ниже код, чтобы получить количество секунд с полуночи.

Однако я не очень хорошо разбираюсь в структурах даты C. Есть ли более простой способ сделать это, используя стандартную библиотеку C ++?

// Get today's date
time_t aTime = time(NULL);

// Set the time to midnight
struct tm* tm = localtime(&aTime);
tm->tm_sec = 0;
tm->tm_min = 0;
tm->tm_hour = 0;
tm->tm_isdst = -1;
time_t midnight = mktime(tm);

// Create object representing now
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);

// Number of seconds (now) since Epoch
const uint64_t nowSecsSinceEpoch = now.tv_sec;

// Number of seconds (now) since midnight = seconds (now) since Epoch minus seconds (at midnight) since Epoch
const uint64_t nowSecsSinceMidnight = nowSecsSinceEpoch - midnight;

1 Ответ

2 голосов
/ 17 апреля 2020

Это зависит от того, имеете ли вы в виду время с полуночи UT C или время с полуночи по местному времени, или, возможно, в каком-то нелокальном, далеком часовом поясе.

Это также значительно упрощается в C ++ 20. Но существует предварительный просмотр частей C ++ 20 библиотеки <chrono> , которые можно использовать с C ++ 11-17.

Время с полуночи UT C

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    auto now = system_clock::now();
    auto today = floor<days>(now);
    auto tod = duration_cast<seconds>(now - today);
}

Это просто получает текущее время (UT C), усекает его с точностью до дней time_point, а затем вычитает два и усекает эту разницу с точностью до секунд.

Время с местной полуночи

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    auto now = current_zone()->to_local(system_clock::now());
    auto today = floor<days>(now);
    auto tod = duration_cast<seconds>(now - today);
}

Эта версия находит текущий локальный часовой пояс вашего компьютера, а затем получает текущее местное время с помощью функции-члена time_zone to_local(). И затем продолжается, как и раньше.

Время с другой полуночи

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    auto now = locate_zone("Australia/Sydney")->to_local(system_clock::now());
    auto today = floor<days>(now);
    auto tod = duration_cast<seconds>(now - today);
}

Наконец, эта версия находит часовой пояс, связанный с Сиднеем, Австралия, а затем использует этот часовой пояс и продолжается, как и раньше.

Предварительный просмотр C ++ 20 <chrono> library бесплатный и с открытым исходным кодом. Он помещает все в дату пространства имен и в два заголовка (и один источник):

  • date.h: библиотека только для заголовка, которая будет выполнять часть UT C, но имеет нет поддержки часового пояса.

  • tz.h: для поддержки часового пояса. Для этого требуется некоторая установка .

...