Я только что понял, что getEpochTimeFromSOY()
предназначен просто для возврата time_t
, связанного с первым годом, а не для вычитания между текущим временем и первым годом. Вот что:
std::time_t
getEpochTimeFromSOY()
{
using namespace date;
using namespace std::chrono;
auto currTime = system_clock::now();
auto y = year_month_day{floor<days>(currTime)}.year();
return floor<seconds>(sys_days{y/1/1} - sys_days{})/1s;
}
Это очень просто в C ++ 20, и есть библиотека для этого с синтаксисом C ++ 20, которая работает обратно в C ++ 11 (используя chrono ).
Вот синтаксис C ++ 20:
#include <ctime>
#include <chrono>
std::time_t
getEpochTimeFromSOY()
{
using namespace std::chrono;
auto currTime = system_clock::now();
auto y = year_month_day{floor<days>(currTime)}.year();
return floor<seconds>(currTime - sys_days{y/1/1})/1s;
}
Вот бесплатная библиотека с открытым исходным кодом только для заголовков, которую вы можете использовать до C ++ 20 , и вот синтаксис для его использования:
#include "date/date.h"
#include <ctime>
#include <chrono>
std::time_t
getEpochTimeFromSOY()
{
using namespace date;
using namespace std::chrono;
auto currTime = system_clock::now();
auto y = year_month_day{floor<days>(currTime)}.year();
return floor<seconds>(currTime - sys_days{y/1/1})/1s;
}
Т.е. включите date.h
и добавьте using namespace date
.
Объяснение кода:
- Получите текущее время как
system_clock::time_point
. - Получите год текущего времени в UT C.
- Вычтите первое мгновение года (UT C ) от текущего времени, обрежьте его с точностью до секунд и извлеките счет, разделив на 1 секунду.
Синтаксис 1s
был введен в C ++ 14. В C ++ 11 вы можете изменить это на seconds{1}
. Или вы можете заменить /1s
на .count()
, чтобы извлечь секунды как целочисленный тип.
Если вы не хотите использовать для этого бесплатную библиотеку с открытым исходным кодом, вы можете взять основные алгоритмы отсюда и кодируйте его самостоятельно.