php strtotime reverse
Asked Answered
S

2

8

Is there some function timetostr in php that will output today/tomorrow/next sunday/etc. from a given timestamp? So that timetostr(strtotime(x))=x

Sarena answered 25/12, 2011 at 13:27 Comment(5)
date(). See php.net/manual/en/function.date.phpIridium
@Andypandy : I know about date(). I meant to ask, is there a direct function that will do reverse of strtotime ?Sarena
if not date, I don't know... could you provide some more context? something like this ($timestring = date('l', $timestamp) doesn't work?Iridium
I wrote one. Just added a switch-case over ($timestamp-strtodate('today'))/86400. I was just wondering whether there already was a function builtin in php.Sarena
Check this out: - #670661Boeke
H
12

This might be useful for people coming here.

/**
 * Format a timestamp to display its age (5 days ago, in 3 days, etc.).
 *
 * @param   int     $timestamp
 * @param   int     $now
 * @return  string
 */
function timetostr($timestamp, $now = null) {
    $age = ($now ?: time()) - $timestamp;
    $future = ($age < 0);
    $age = abs($age);

    $age = (int)($age / 60);        // minutes ago
    if ($age == 0) return $future ? "momentarily" : "just now";

    $scales = [
        ["minute", "minutes", 60],
        ["hour", "hours", 24],
        ["day", "days", 7],
        ["week", "weeks", 4.348214286],     // average with leap year every 4 years
        ["month", "months", 12],
        ["year", "years", 10],
        ["decade", "decades", 10],
        ["century", "centuries", 1000],
        ["millenium", "millenia", PHP_INT_MAX]
    ];

    foreach ($scales as list($singular, $plural, $factor)) {
        if ($age == 0)
            return $future
                ? "in less than 1 $singular"
                : "less than 1 $singular ago";
        if ($age == 1)
            return $future
                ? "in 1 $singular"
                : "1 $singular ago";
        if ($age < $factor)
            return $future
                ? "in $age $plural"
                : "$age $plural ago";
        $age = (int)($age / $factor);
    }
}
Hienhieracosphinx answered 10/11, 2013 at 5:0 Comment(4)
I'm getting an ERROR: unexpected 'list' (T_LIST). What am I doing wrong?Wage
Something todo with PHP versions? I got it working by declaring the list list($singular, $plural, $factor) = $scale; inside the foreach and replacing the list in the foreach prams with $listWage
That's correct. PHP 5.5 added "Unpacking nested arrays with list()" (php.net/manual/en/control-structures.foreach.php)Hienhieracosphinx
Thank you! That saved me a lot of time. This should be a built in function!Intemerate
M
3

There cannot be a strtotime reverse function because this is not a bijection. The source string from which you get a UNIX timestamp when you use strtotimecan be formatted in many different ways. So if you decide to reverse the function, how can you know what string format to use ? It could well be 2010-08-05 or 10 September 2000, etc. This is exactly why there is no reverse function, but as Andypandy rightly said, you have to use date()which allows you to actually define the string format you wish to end up with. I know this question is old, but I thought it deserved this answer so other users understand why there is no such function in PHP.

Merete answered 28/12, 2012 at 19:59 Comment(2)
whilst technically "correct" this does not answers the OP's question, rather it just furthers a negative stereotype of the all knowing programmer who knows better than the person asking the question. another approach would be to say something like this--> https://mcmap.net/q/1325205/-converting-a-datetime-back-to-the-original-formatTabbi
date("Y-m-d",time()) can do the job.Cheerio

© 2022 - 2024 — McMap. All rights reserved.