From 4aa3f7b86d1e2e78010a5603c3df441d04f79179 Mon Sep 17 00:00:00 2001 From: Kristian Bendiksen Date: Wed, 29 Mar 2023 09:35:36 +0200 Subject: [PATCH] #9773 Add option for resampling to hour intervals. --- .../Application/RiaDateTimeDefines.h | 1 + .../Application/Tools/RiaQDateTimeTools.cpp | 27 +++++++++++++++++-- .../Application/Tools/RiaQDateTimeTools.h | 10 +++++-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/ApplicationLibCode/Application/RiaDateTimeDefines.h b/ApplicationLibCode/Application/RiaDateTimeDefines.h index dcd235464dc..f8512988492 100644 --- a/ApplicationLibCode/Application/RiaDateTimeDefines.h +++ b/ApplicationLibCode/Application/RiaDateTimeDefines.h @@ -45,6 +45,7 @@ enum class TimeFormatComponents enum class DateTimePeriod { NONE = -1, + HOUR, DAY, WEEK, MONTH, diff --git a/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.cpp b/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.cpp index 21338f8424f..35c1eb9c18b 100644 --- a/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "cafPdmUiItem.h" @@ -32,6 +33,7 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- +const DateTimeSpan RiaQDateTimeTools::TIMESPAN_HOUR = DateTimeSpan( 0, 0, 0, 1 ); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_DAY = DateTimeSpan( 0, 0, 1 ); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_WEEK = DateTimeSpan( 0, 0, 7 ); const DateTimeSpan RiaQDateTimeTools::TIMESPAN_MONTH = DateTimeSpan( 0, 1, 0 ); @@ -48,6 +50,14 @@ Qt::TimeSpec RiaQDateTimeTools::currentTimeSpec() return Qt::UTC; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +quint64 RiaQDateTimeTools::secondsInHour() +{ + return 60 * 60; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -142,7 +152,11 @@ QDateTime RiaQDateTimeTools::addYears( const QDateTime& dt, double years ) //-------------------------------------------------------------------------------------------------- QDateTime RiaQDateTimeTools::addSpan( const QDateTime& dt, DateTimeSpan span ) { - return createUtcDateTime( dt ).addYears( span.years() ).addMonths( span.months() ).addDays( span.days() ); + return createUtcDateTime( dt ) + .addYears( span.years() ) + .addMonths( span.months() ) + .addDays( span.days() ) + .addSecs( span.hours() * RiaQDateTimeTools::secondsInHour() ); } //-------------------------------------------------------------------------------------------------- @@ -150,7 +164,11 @@ QDateTime RiaQDateTimeTools::addSpan( const QDateTime& dt, DateTimeSpan span ) //-------------------------------------------------------------------------------------------------- QDateTime RiaQDateTimeTools::subtractSpan( const QDateTime& dt, DateTimeSpan span ) { - return createUtcDateTime( dt ).addYears( -span.years() ).addMonths( -span.months() ).addDays( -span.days() ); + return createUtcDateTime( dt ) + .addYears( -span.years() ) + .addMonths( -span.months() ) + .addDays( -span.days() ) + .addSecs( -span.hours() * RiaQDateTimeTools::secondsInHour() ); } //-------------------------------------------------------------------------------------------------- @@ -250,6 +268,8 @@ const DateTimeSpan RiaQDateTimeTools::timeSpan( RiaDefines::DateTimePeriod perio { switch ( period ) { + case RiaDefines::DateTimePeriod::HOUR: + return TIMESPAN_HOUR; case RiaDefines::DateTimePeriod::DAY: return TIMESPAN_DAY; case RiaDefines::DateTimePeriod::WEEK: @@ -278,9 +298,12 @@ QDateTime RiaQDateTimeTools::truncateTime( const QDateTime& dt, RiaDefines::Date int m = dt.date().month(); int d = dt.date().day(); int dow = dt.date().dayOfWeek(); + int h = dt.time().hour(); switch ( period ) { + case RiaDefines::DateTimePeriod::HOUR: + return createUtcDateTime( QDate( y, m, d ), QTime( h, 0, 0 ) ); case RiaDefines::DateTimePeriod::DAY: return createUtcDateTime( QDate( y, m, d ) ); case RiaDefines::DateTimePeriod::WEEK: diff --git a/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.h b/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.h index abb307e23f7..b89c4999552 100644 --- a/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.h +++ b/ApplicationLibCode/Application/Tools/RiaQDateTimeTools.h @@ -99,6 +99,7 @@ class RiaQDateTimeTools getTimeStepsWithinSelectedRange( const std::vector& timeSteps, const QDateTime& fromTimeStep, const QDateTime& toTimeStep ); private: + static const DateTimeSpan TIMESPAN_HOUR; static const DateTimeSpan TIMESPAN_DAY; static const DateTimeSpan TIMESPAN_WEEK; static const DateTimeSpan TIMESPAN_MONTH; @@ -109,6 +110,7 @@ class RiaQDateTimeTools static quint64 secondsInDay(); static quint64 secondsInYear(); + static quint64 secondsInHour(); }; //================================================================================================== @@ -121,23 +123,27 @@ class DateTimeSpan : m_years( 0 ) , m_months( 0 ) , m_days( 0 ) + , m_hours( 0 ) { } - DateTimeSpan( int years, int months, int days ) + DateTimeSpan( int years, int months, int days, int hours = 0 ) : m_years( years ) , m_months( months ) , m_days( days ) + , m_hours( hours ) { } int years() const { return m_years; } int months() const { return m_months; } int days() const { return m_days; } + int hours() const { return m_hours; } - bool isEmpty() { return m_years == 0 && m_months == 0 && m_days; } + bool isEmpty() { return m_years == 0 && m_months == 0 && m_days == 0 && m_hours == 0; } private: int m_years; int m_months; int m_days; + int m_hours; };