Given
boost::posix_time::ptime aTime( time_from_string("2012-01-01 11:15:00"));
My function will return 2012-01-01 12:00:00
or given boundary case:
boost::posix_time::ptime boundaryTime( time_from_string("2012-01-01 23:45:00"));
My function will return
2012-01-02 00:00:00
Here's an example. I've assumed that fractional seconds should be ignored. I've also assumed that if the original time was already exactly on the hour, then it does not need to be incremented to the next hour.
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
namespace bpt = boost::posix_time;
bpt::ptime roundedToNextHour(const bpt::ptime& time)
{
// Get time-of-day portion of the time, ignoring fractional seconds
bpt::time_duration tod = bpt::seconds(time.time_of_day().total_seconds());
// Round time-of-day down to start of the hour
bpt::time_duration roundedDownTod = bpt::hours(tod.hours());
// Construct the result with the same date, but with the rounded-down
// time-of-day.
bpt::ptime result(time.date(), roundedDownTod);
// If the original time was not already on the hour, add one-hour to the
// result. Boost knows how to handle the case where time overflows to the
// next day.
if (tod != roundedDownTod)
result += bpt::hours(1);
return result;
}
int main()
{
bpt::ptime aTime( bpt::time_from_string("2012-01-01 11:15:00"));
bpt::ptime boundaryTime( bpt::time_from_string("2012-01-01 23:45:00"));
bpt::ptime onTheHour( bpt::time_from_string("2012-01-01 23:00:00"));
std::cout << roundedToNextHour(aTime) << "\n";
std::cout << roundedToNextHour(boundaryTime) << "\n";
std::cout << roundedToNextHour(onTheHour) << "\n";
}
Output:
2012-Jan-01 12:00:00
2012-Jan-02 00:00:00
2012-Jan-01 23:00:00
I hope this example helped you learn how Boost Posix Time works.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With