From 7b7ac8fc7e29542d665e11dda3ab6a2b6c987b08 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Thu, 16 Dec 2021 16:30:26 -0500 Subject: [PATCH] Add utility functions TimePointToString and SystemTimePointToString --- src/CMakeLists.txt | 1 + src/zm_time.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++ src/zm_time.h | 4 ++++ 3 files changed, 57 insertions(+) create mode 100644 src/zm_time.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 80e09e9c3..8852391a4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,6 +60,7 @@ set(ZM_BIN_SRC_FILES zm_signal.cpp zm_stream.cpp zm_swscale.cpp + zm_time.cpp zm_user.cpp zm_utils.cpp zm_videostore.cpp diff --git a/src/zm_time.cpp b/src/zm_time.cpp new file mode 100644 index 000000000..9d4c281c4 --- /dev/null +++ b/src/zm_time.cpp @@ -0,0 +1,52 @@ +// +// ZoneMinder Time Functions & Definitions, $Date$, $Revision$ +// Copyright (C) 2001-2008 Philip Coombes +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// + +#include "zm_time.h" + +#include + +std::string SystemTimePointToString(SystemTimePoint tp) { + time_t tp_sec = std::chrono::system_clock::to_time_t(tp); + Microseconds now_frac = std::chrono::duration_cast( + tp.time_since_epoch() - std::chrono::duration_cast(tp.time_since_epoch())); + + std::string timeString; + timeString.reserve(64); + char *timePtr = timeString.data(); + tm tp_tm = {}; + timePtr += strftime(timePtr, timeString.capacity(), "%x %H:%M:%S", localtime_r(&tp_sec, &tp_tm)); + snprintf(timePtr, timeString.capacity() - (timePtr - timeString.data()), ".%06" PRIi64, static_cast(now_frac.count())); + return timeString; +} + +std::string TimePointToString(TimePoint tp) { + time_t tp_sec = std::chrono::system_clock::to_time_t( + std::chrono::system_clock::now() + (tp - std::chrono::steady_clock::now())); + + Microseconds now_frac = std::chrono::duration_cast( + tp.time_since_epoch() - std::chrono::duration_cast(tp.time_since_epoch())); + + std::string timeString; + timeString.reserve(64); + char *timePtr = timeString.data(); + tm tp_tm = {}; + timePtr += strftime(timePtr, timeString.capacity(), "%x %H:%M:%S", localtime_r(&tp_sec, &tp_tm)); + snprintf(timePtr, timeString.capacity() - (timePtr - timeString.data()), ".%06" PRIi64, static_cast(now_frac.count())); + return timeString; +} diff --git a/src/zm_time.h b/src/zm_time.h index d3d5b95c5..7aaea7316 100644 --- a/src/zm_time.h +++ b/src/zm_time.h @@ -21,6 +21,7 @@ #define ZM_TIME_H #include +#include #include typedef std::chrono::microseconds Microseconds; @@ -120,4 +121,7 @@ class TimeSegmentAdder { bool finished_; }; +std::string SystemTimePointToString(SystemTimePoint tp); +std::string TimePointToString(TimePoint tp); + #endif // ZM_TIME_H