How to calculate relative past time from a given date & time (e.g., 3 hours ago, 5 days ago, a month ago) in C++

1 Answer

0 votes
#include <iostream>
#include <chrono>
#include <cmath> // fabs // floor
#include <string>

using namespace std::chrono;

std::string ToRelativePastTime(system_clock::time_point dateTime) {
    auto now = system_clock::now();
    auto ts = now - dateTime;

    double delta = duration_cast<seconds>(ts).count();
    delta = fabs(delta);

    long seconds = (long)delta;
    long minutes = seconds / 60;
    long hours   = seconds / 3600;
    long days    = seconds / 86400;

    if (seconds < 60)
        return (seconds == 1) ? "one second ago" : std::to_string(seconds) + " seconds ago";

    if (seconds < 3600)
        return (minutes == 1) ? "a minute ago" : std::to_string(minutes) + " minutes ago";

    if (seconds < 86400)
        return (hours == 1) ? "an hour ago" : std::to_string(hours) + " hours ago";

    if (seconds < 2592000)
        return (days == 1) ? "yesterday" : std::to_string(days) + " days ago";

    if (seconds < 31104000) {
        int months = (int)floor(days / 30.0);
        return (months <= 1) ? "a month ago" : std::to_string(months) + " months ago";
    }

    int years = (int)floor(days / 365.0);
    
    return (years <= 1) ? "a year ago" : std::to_string(years) + " years ago";
}

int main()
{
    auto now = system_clock::now();

    auto test = [&](double hoursAgo)
    {
        auto past = now - duration_cast<system_clock::duration>(
                            duration<double>(hoursAgo * 3600.0)
                     );
        std::cout << ToRelativePastTime(past) << std::endl;
    };

    test(0.01);   // 36 seconds ago
    test(0.2);    // 12 minutes ago
    test(3);      // 3 hours ago
    test(25);     // yesterday
    test(360);    // 15 days ago
    test(1239);   // a month ago
    test(2239);   // 3 months ago
    test(8760);   // a year ago
    test(98763);  // 11 years ago
}


/*
run:

36 seconds ago
12 minutes ago
3 hours ago
yesterday
15 days ago
a month ago
3 months ago
a year ago
11 years ago

*/

 



answered Apr 13 by avibootz
edited Apr 13 by avibootz

Related questions

...