Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to round up to the next hour given a boost::posix_time::ptime

Tags:

boost

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
like image 747
John Avatar asked Feb 20 '12 18:02

John


1 Answers

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.

like image 148
Emile Cormier Avatar answered Oct 30 '22 05:10

Emile Cormier