diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index aea9678d..9c98e0c6 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -30,6 +30,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#endif + namespace scwx { namespace qt @@ -407,8 +411,14 @@ void MainWindow::on_resourceTreeView_doubleClicked(const QModelIndex& index) static const std::string timeFormat {"%Y-%m-%d %H:%M:%S"}; + using namespace std::chrono; + +#if !defined(_MSC_VER) + using namespace date; +#endif + std::istringstream in {selectedString}; - in >> std::chrono::parse(timeFormat, time); + in >> parse(timeFormat, time); if (in.fail()) { diff --git a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp index 6fe192ae..735d78e4 100644 --- a/scwx-qt/source/scwx/qt/map/overlay_layer.cpp +++ b/scwx-qt/source/scwx/qt/map/overlay_layer.cpp @@ -22,6 +22,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#endif + #if defined(_MSC_VER) # pragma warning(pop) #endif @@ -95,8 +99,16 @@ void OverlayLayer::Render( if (p->sweepTimeNeedsUpdate_ && radarProductView != nullptr) { + const scwx::util::time_zone* currentZone; + +#if defined(_MSC_VER) + currentZone = std::chrono::current_zone(); +#else + currentZone = date::current_zone(); +#endif + p->sweepTimeString_ = scwx::util::TimeString( - radarProductView->sweep_time(), std::chrono::current_zone(), false); + radarProductView->sweep_time(), currentZone, false); p->sweepTimeNeedsUpdate_ = false; } diff --git a/wxdata/include/scwx/util/time.hpp b/wxdata/include/scwx/util/time.hpp index a5c87a11..dc58aa14 100644 --- a/wxdata/include/scwx/util/time.hpp +++ b/wxdata/include/scwx/util/time.hpp @@ -2,16 +2,26 @@ #include +#if !defined(_MSC_VER) +# include +#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 diff --git a/wxdata/source/scwx/awips/coded_time_motion_location.cpp b/wxdata/source/scwx/awips/coded_time_motion_location.cpp index 5144e90a..aa5016b6 100644 --- a/wxdata/source/scwx/awips/coded_time_motion_location.cpp +++ b/wxdata/source/scwx/awips/coded_time_motion_location.cpp @@ -8,6 +8,10 @@ #include +#if !defined(_MSC_VER) +# include +#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 {}; + p->time_ = std::chrono::hh_mm_ss {}; dataValid = false; } } diff --git a/wxdata/source/scwx/awips/pvtec.cpp b/wxdata/source/scwx/awips/pvtec.cpp index 1e8ded8d..4c1213f2 100644 --- a/wxdata/source/scwx/awips/pvtec.cpp +++ b/wxdata/source/scwx/awips/pvtec.cpp @@ -12,6 +12,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#endif + namespace scwx { namespace awips @@ -87,7 +91,7 @@ public: PVtec::PVtec() : p(std::make_unique()) {} 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 eventBegin; - sys_time eventEnd; + std::chrono::sys_time eventBegin; + std::chrono::sys_time eventEnd; ssEventBegin >> parse(dateTimeFormat, eventBegin); ssEventEnd >> parse(dateTimeFormat, eventEnd); diff --git a/wxdata/source/scwx/network/dir_list.cpp b/wxdata/source/scwx/network/dir_list.cpp index 625026c2..6f0f1980 100644 --- a/wxdata/source/scwx/network/dir_list.cpp +++ b/wxdata/source/scwx/network/dir_list.cpp @@ -11,6 +11,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#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 mtime; + std::istringstream ssCharacters {characters}; + std::chrono::sys_time mtime; ssCharacters >> parse(kDateTimeFormat, mtime); if (!ssCharacters.fail()) diff --git a/wxdata/source/scwx/provider/aws_level2_data_provider.cpp b/wxdata/source/scwx/provider/aws_level2_data_provider.cpp index dced937d..56d4ea7a 100644 --- a/wxdata/source/scwx/provider/aws_level2_data_provider.cpp +++ b/wxdata/source/scwx/provider/aws_level2_data_provider.cpp @@ -5,6 +5,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#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)}; diff --git a/wxdata/source/scwx/provider/aws_level3_data_provider.cpp b/wxdata/source/scwx/provider/aws_level3_data_provider.cpp index 5f4cd508..49014196 100644 --- a/wxdata/source/scwx/provider/aws_level3_data_provider.cpp +++ b/wxdata/source/scwx/provider/aws_level3_data_provider.cpp @@ -9,6 +9,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#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)}; diff --git a/wxdata/source/scwx/provider/warnings_provider.cpp b/wxdata/source/scwx/provider/warnings_provider.cpp index a69bfbcb..6dacc8ea 100644 --- a/wxdata/source/scwx/provider/warnings_provider.cpp +++ b/wxdata/source/scwx/provider/warnings_provider.cpp @@ -14,6 +14,10 @@ #include #include +#if !defined(_MSC_VER) +# include +#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 startTime; - std::istringstream ssFilename {record.filename_}; + std::chrono::sys_time startTime; + std::istringstream ssFilename {record.filename_}; ssFilename >> parse(dateTimeFormat, startTime); diff --git a/wxdata/source/scwx/util/time.cpp b/wxdata/source/scwx/util/time.cpp index 05983b18..7893b337 100644 --- a/wxdata/source/scwx/util/time.cpp +++ b/wxdata/source/scwx/util/time.cpp @@ -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(time); std::ostringstream os;