#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
*/