util/TimeISO8601: new utility library

This commit is contained in:
Max Kellermann 2018-07-25 08:29:34 +02:00
parent 517f5b1999
commit 235ddc0990
5 changed files with 123 additions and 14 deletions

View File

@ -518,6 +518,7 @@ libutil_a_SOURCES = \
src/util/TemplateString.hxx \
src/util/TimeParser.cxx src/util/TimeParser.hxx \
src/util/TimeConvert.cxx src/util/TimeConvert.hxx \
src/util/TimeISO8601.cxx src/util/TimeISO8601.hxx \
src/util/UriUtil.cxx src/util/UriUtil.hxx \
src/util/Manual.hxx \
src/util/StaticFifoBuffer.hxx \

View File

@ -31,7 +31,7 @@
#include "util/StringStrip.hxx"
#include "util/StringView.hxx"
#include "util/ASCII.hxx"
#include "util/TimeParser.hxx"
#include "util/TimeISO8601.hxx"
#include "util/UriUtil.hxx"
#include "lib/icu/CaseFold.hxx"
@ -219,7 +219,7 @@ ParseTimeStamp(const char *s)
return std::chrono::system_clock::from_time_t((time_t)value);
/* try ISO 8601 */
return ParseTimePoint(s, "%FT%TZ");
return ParseISO8601(s);
}
static constexpr bool

View File

@ -20,27 +20,19 @@
#include "config.h"
#include "TimePrint.hxx"
#include "client/Response.hxx"
#include "util/TimeConvert.hxx"
#include "util/TimeISO8601.hxx"
void
time_print(Response &r, const char *name,
std::chrono::system_clock::time_point t)
{
struct tm tm;
StringBuffer<64> s;
try {
tm = GmTime(t);
s = FormatISO8601(t);
} catch (...) {
return;
}
char buffer[32];
strftime(buffer, sizeof(buffer),
#ifdef _WIN32
"%Y-%m-%dT%H:%M:%SZ",
#else
"%FT%TZ",
#endif
&tm);
r.Format("%s: %s\n", name, buffer);
r.Format("%s: %s\n", name, s.c_str());
}

61
src/util/TimeISO8601.cxx Normal file
View File

@ -0,0 +1,61 @@
/*
* 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 "TimeISO8601.hxx"
#include "TimeConvert.hxx"
#include "TimeParser.hxx"
StringBuffer<64>
FormatISO8601(const struct tm &tm) noexcept
{
StringBuffer<64> buffer;
strftime(buffer.data(), buffer.capacity(),
#ifdef _WIN32
"%Y-%m-%dT%H:%M:%SZ",
#else
"%FT%TZ",
#endif
&tm);
return buffer;
}
StringBuffer<64>
FormatISO8601(std::chrono::system_clock::time_point tp)
{
return FormatISO8601(GmTime(tp));
}
std::chrono::system_clock::time_point
ParseISO8601(const char *s)
{
return ParseTimePoint(s, "%FT%TZ");
}

55
src/util/TimeISO8601.hxx Normal file
View File

@ -0,0 +1,55 @@
/*
* 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_ISO8601_HXX
#define TIME_ISO8601_HXX
#include "StringBuffer.hxx"
#include "Compiler.h"
#include <string>
#include <chrono>
struct tm;
gcc_pure
StringBuffer<64>
FormatISO8601(const struct tm &tm) noexcept;
gcc_pure
StringBuffer<64>
FormatISO8601(std::chrono::system_clock::time_point tp);
std::chrono::system_clock::time_point
ParseISO8601(const char *s);
#endif