#include <stdio.h>
#include <time.h>
#include <math.h>
const char* ToRelativePastTime(time_t past, char* buffer, size_t size) {
time_t now = time(NULL);
double delta = fabs(difftime(now, past));
long seconds = (long)delta;
long minutes = seconds / 60;
long hours = seconds / 3600;
long days = seconds / 86400;
if (seconds < 60) {
if (seconds == 1)
snprintf(buffer, size, "one second ago");
else
snprintf(buffer, size, "%ld seconds ago", seconds);
return buffer;
}
if (seconds < 3600) {
if (minutes == 1)
snprintf(buffer, size, "a minute ago");
else
snprintf(buffer, size, "%ld minutes ago", minutes);
return buffer;
}
if (seconds < 86400) {
if (hours == 1)
snprintf(buffer, size, "an hour ago");
else
snprintf(buffer, size, "%ld hours ago", hours);
return buffer;
}
if (seconds < 2592000) { // 30 days
if (days == 1)
snprintf(buffer, size, "yesterday");
else
snprintf(buffer, size, "%ld days ago", days);
return buffer;
}
if (seconds < 31104000) { // 12 months
int months = (int)floor(days / 30.0);
if (months <= 1)
snprintf(buffer, size, "a month ago");
else
snprintf(buffer, size, "%d months ago", months);
return buffer;
}
int years = (int)floor(days / 365.0);
if (years <= 1)
snprintf(buffer, size, "a year ago");
else
snprintf(buffer, size, "%d years ago", years);
return buffer;
}
int main(void)
{
char buf[64];
time_t now = time(NULL);
time_t tests[] = {
now - 36, // 36 seconds
now - 12*60, // 12 minutes
now - 3*3600, // 3 hours
now - 25*3600, // 25 hours
now - 15*86400, // 15 days
now - 30*86400, // 1 month
now - 90*86400, // 3 months
now - 365*86400, // 1 year
now - 11*365*86400 // 11 years
};
for (int i = 0; i < 9; i++) {
printf("%s\n", ToRelativePastTime(tests[i], buf, sizeof(buf)));
}
return 0;
}
/*
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
*/