Use HH date library when not using MSVC

This commit is contained in:
Dan Paulat 2023-04-17 18:13:42 -05:00
parent e78dc9b3db
commit 593010acc2
10 changed files with 98 additions and 14 deletions

View file

@ -2,16 +2,26 @@
#include <chrono>
#if !defined(_MSC_VER)
# include <date/tz.h>
#endif
namespace scwx
{
namespace util
{
#if defined(_MSC_VER)
typedef std::chrono::time_zone time_zone;
#else
typedef date::time_zone time_zone;
#endif
std::chrono::system_clock::time_point TimePoint(uint32_t modifiedJulianDate,
uint32_t milliseconds);
std::string TimeString(std::chrono::system_clock::time_point time,
const std::chrono::time_zone* timeZone = nullptr,
const time_zone* timeZone = nullptr,
bool epochValid = true);
} // namespace util

View file

@ -8,6 +8,10 @@
#include <sstream>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
namespace scwx
{
namespace awips
@ -98,6 +102,10 @@ bool CodedTimeMotionLocation::Parse(const StringRange& lines,
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
static const std::string timeFormat {"%H%MZ"};
std::istringstream in {time};
@ -106,12 +114,12 @@ bool CodedTimeMotionLocation::Parse(const StringRange& lines,
if (time.size() == 5 && !in.fail())
{
p->time_ = hh_mm_ss {tp};
p->time_ = std::chrono::hh_mm_ss {tp};
}
else
{
logger_->warn("Invalid time: \"{}\"", time);
p->time_ = hh_mm_ss<minutes> {};
p->time_ = std::chrono::hh_mm_ss<minutes> {};
dataValid = false;
}
}

View file

@ -12,6 +12,10 @@
#include <boost/bimap.hpp>
#include <boost/bimap/unordered_set_of.hpp>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
namespace scwx
{
namespace awips
@ -87,7 +91,7 @@ public:
PVtec::PVtec() : p(std::make_unique<PVtecImpl>()) {}
PVtec::~PVtec() = default;
PVtec::PVtec(PVtec&&) noexcept = default;
PVtec::PVtec(PVtec&&) noexcept = default;
PVtec& PVtec::operator=(PVtec&&) noexcept = default;
PVtec::ProductType PVtec::fixed_identifier() const
@ -134,6 +138,10 @@ bool PVtec::Parse(const std::string& s)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
// P-VTEC takes the form:
// /k.aaa.cccc.pp.s.####.yymmddThhnnZ-yymmddThhnnZ/
// 012345678901234567890123456789012345678901234567
@ -187,8 +195,8 @@ bool PVtec::Parse(const std::string& s)
std::istringstream ssEventBegin {sEventBegin};
std::istringstream ssEventEnd {sEventEnd};
sys_time<minutes> eventBegin;
sys_time<minutes> eventEnd;
std::chrono::sys_time<minutes> eventBegin;
std::chrono::sys_time<minutes> eventEnd;
ssEventBegin >> parse(dateTimeFormat, eventBegin);
ssEventEnd >> parse(dateTimeFormat, eventEnd);

View file

@ -11,6 +11,10 @@
#include <cpr/cpr.h>
#include <libxml/HTMLparser.h>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
#if defined(_MSC_VER)
# pragma warning(pop)
#endif
@ -177,13 +181,16 @@ void DirListSAXHandler::Characters(void* userData, const xmlChar* ch, int len)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
// Date time format: yyyy-mm-dd hh:mm
static const std::string kDateTimeFormat {"%Y-%m-%d %H:%M"};
static constexpr size_t kDateTimeSize {16u};
// Attempt to parse the date time
std::istringstream ssCharacters {characters};
sys_time<minutes> mtime;
std::istringstream ssCharacters {characters};
std::chrono::sys_time<minutes> mtime;
ssCharacters >> parse(kDateTimeFormat, mtime);
if (!ssCharacters.fail())

View file

@ -5,6 +5,10 @@
#include <fmt/chrono.h>
#include <fmt/format.h>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
namespace scwx
{
namespace provider
@ -73,6 +77,10 @@ AwsLevel2DataProvider::GetTimePointFromKey(const std::string& key)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
static const std::string timeFormat {"%Y%m%d_%H%M%S"};
std::string timeStr {key.substr(offset, formatSize)};

View file

@ -9,6 +9,10 @@
#include <fmt/chrono.h>
#include <fmt/format.h>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
namespace scwx
{
namespace provider
@ -99,6 +103,10 @@ AwsLevel3DataProvider::GetTimePointFromKey(const std::string& key)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
static const std::string timeFormat {"%Y_%m_%d_%H_%M_%S"};
std::string timeStr {key.substr(offset, formatSize)};

View file

@ -14,6 +14,10 @@
#include <cpr/cpr.h>
#include <libxml/HTMLparser.h>
#if !defined(_MSC_VER)
# include <date/date.h>
#endif
#if defined(_MSC_VER)
# pragma warning(pop)
#endif
@ -69,6 +73,10 @@ WarningsProvider::ListFiles(std::chrono::system_clock::time_point newerThan)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
static const std::regex reWarningsFilename {
"warnings_[0-9]{8}_[0-9]{2}.txt"};
static const std::string dateTimeFormat {"warnings_%Y%m%d_%H.txt"};
@ -104,8 +112,8 @@ WarningsProvider::ListFiles(std::chrono::system_clock::time_point newerThan)
for (auto& record : warningRecords)
{
// Determine start time
sys_time<hours> startTime;
std::istringstream ssFilename {record.filename_};
std::chrono::sys_time<hours> startTime;
std::istringstream ssFilename {record.filename_};
ssFilename >> parse(dateTimeFormat, startTime);

View file

@ -22,10 +22,15 @@ std::chrono::system_clock::time_point TimePoint(uint32_t modifiedJulianDate,
}
std::string TimeString(std::chrono::system_clock::time_point time,
const std::chrono::time_zone* timeZone,
const time_zone* timeZone,
bool epochValid)
{
using namespace std::chrono;
#if !defined(_MSC_VER)
using namespace date;
#endif
auto timeInSeconds = time_point_cast<seconds>(time);
std::ostringstream os;