For adatetime is since 12:00AM, return: "Today at H:MM [A]PM"
    For adatetime is between 12:00AM and 11:59PM on yesterday:
                                    "Yesterday at 6:23 PM"
    For adatetime is between 2 and 6 days ago: "[2-6] days ago"
    For adatetime is 7 days ago: "1 week ago"
    For adatetime is 8-14 days ago: "Over 1 week ago"
    For adatetime is 15-21 days ago: "Over 2 weeks ago"
    For adatetime is 22-28 days ago: "Over 3 weeks ago"
    For adatetime is 29-56 days ago: "Over 1 month ago"
    For adatetime is 57-84 days ago: "Over 2 months ago"
    For adatetime is 85-112 days ago: "Over 3 months ago"
    and so on, in increments of 28 days, until T-365,
    at which point: "Over 1 year ago",
    then after another 365 days "Over 2 years ago", etc

def past_datetime_str(adatetime):
    """
    For adatetime is since 12:00AM, return: "Today at H:MM [A]PM"
    For adatetime is between 12:00AM and 11:59PM on yesterday:
                                    "Yesterday at 6:23 PM"
    For adatetime is between 2 and 6 days ago: "[2-6] days ago"
    For adatetime is 7 days ago: "1 week ago"
    For adatetime is 8-14 days ago: "Over 1 week ago"
    For adatetime is 15-21 days ago: "Over 2 weeks ago"
    For adatetime is 22-28 days ago: "Over 3 weeks ago"
    For adatetime is 29-56 days ago: "Over 1 month ago"
    For adatetime is 57-84 days ago: "Over 2 months ago"
    For adatetime is 85-112 days ago: "Over 3 months ago"
    and so on, in increments of 28 days, until T-365,
    at which point: "Over 1 year ago",
    then after another 365 days "Over 2 years ago", etc
    """
    if is_today(adatetime):
        return "today at {}".format(time_str(adatetime))

    if last_midnight() - adatetime <= timedelta(days=7):
        for day in range(1, 8):
            if is_days_ago(adatetime, day):
                if day == 1:
                    return "yesterday at {}".format(time_str(adatetime))
                if day == 7:
                    return "1 week ago"
                return "{:.0f} days ago".format(day)

    if last_midnight() - adatetime <= timedelta(days=28):
        week = get_past_weeks_count(adatetime)
        if week == 1:
            return "over {:.0f} week ago".format(week)
        else:
            return "over {:.0f} weeks ago".format(week)

    if last_midnight() - adatetime <= timedelta(days=365):
        month = get_past_months_count(adatetime)
        if month == 1:
            return "over {:.0f} month ago".format(month)
        else:
            return "over {:.0f} months ago".format(month)

    year = get_past_years_count(adatetime)
    if year == 1:
        return "over {:.0f} year ago".format(year)
    else:
        return "over {:.0f} years ago".format(year)