diff options
author | Max Kellermann <max@musicpd.org> | 2018-07-25 08:29:55 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2018-07-25 08:34:52 +0200 |
commit | 517f5b19991800dcc76677234c5ffa67aca8af0e (patch) | |
tree | c89f48245747ebf1d534fd8eca17aa0ee9814232 /src/util | |
parent | a8ac8b25638b0dae65b8770de2725828e7372427 (diff) |
util/TimeConvert: new utility library
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/TimeConvert.cxx | 83 | ||||
-rw-r--r-- | src/util/TimeConvert.hxx | 66 |
2 files changed, 149 insertions, 0 deletions
diff --git a/src/util/TimeConvert.cxx b/src/util/TimeConvert.cxx new file mode 100644 index 000000000..e0d506018 --- /dev/null +++ b/src/util/TimeConvert.cxx @@ -0,0 +1,83 @@ +/* + * Copyright 2007-2017 Content Management AG + * All rights reserved. + * + * author: Max Kellermann <mk@cm4all.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "TimeConvert.hxx" + +#include <stdexcept> + +#include <time.h> + +struct tm +GmTime(std::chrono::system_clock::time_point tp) +{ + const time_t t = std::chrono::system_clock::to_time_t(tp); +#ifdef _WIN32 + const struct tm *tm = gmtime(&t); +#else + struct tm buffer, *tm = gmtime_r(&t, &buffer); +#endif + if (tm == nullptr) + throw std::runtime_error("gmtime_r() failed"); + + return *tm; +} + +struct tm +LocalTime(std::chrono::system_clock::time_point tp) +{ + const time_t t = std::chrono::system_clock::to_time_t(tp); +#ifdef _WIN32 + const struct tm *tm = localtime(&t); +#else + struct tm buffer, *tm = localtime_r(&t, &buffer); +#endif + if (tm == nullptr) + throw std::runtime_error("localtime_r() failed"); + + return *tm; +} + +#ifdef __GLIBC__ + +std::chrono::system_clock::time_point +TimeGm(struct tm &tm) +{ + return std::chrono::system_clock::from_time_t(timegm(&tm)); +} + +#endif + +std::chrono::system_clock::time_point +MakeTime(struct tm &tm) +{ + return std::chrono::system_clock::from_time_t(mktime(&tm)); +} diff --git a/src/util/TimeConvert.hxx b/src/util/TimeConvert.hxx new file mode 100644 index 000000000..5f75cd40f --- /dev/null +++ b/src/util/TimeConvert.hxx @@ -0,0 +1,66 @@ +/* + * Copyright 2007-2017 Content Management AG + * All rights reserved. + * + * author: Max Kellermann <mk@cm4all.com> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef TIME_CONVERT_HXX +#define TIME_CONVERT_HXX + +#include <chrono> + +/** + * Convert a UTC-based time point to a UTC-based "struct tm". + */ +struct tm +GmTime(std::chrono::system_clock::time_point tp); + +/** + * Convert a UTC-based time point to a local "struct tm". + */ +struct tm +LocalTime(std::chrono::system_clock::time_point tp); + +#ifdef __GLIBC__ + +/** + * Convert a UTC-based "struct tm" to a UTC-based time point. + */ +std::chrono::system_clock::time_point +TimeGm(struct tm &tm); + +#endif + +/** + * Convert a local "struct tm" to a UTC-based time point. + */ +std::chrono::system_clock::time_point +MakeTime(struct tm &tm); + +#endif |