Konvertieren des Zeitstempels in PHP vor einer Zeit, z. B. vor 1 Tag, vor 2 Tagen …

Lesezeit: 2 Minuten

Konvertieren des Zeitstempels in PHP vor einer Zeit z B
willtanzen

Ich versuche, einen Zeitstempel des Formats zu konvertieren 2009-09-12 20:57:19 und verwandeln Sie es in etwas wie 3 minutes ago mit PHP.

Ich habe ein nützliches Skript gefunden, um dies zu tun, aber ich denke, es sucht nach einem anderen Format, das als Zeitvariable verwendet werden kann. Das Skript, das ich ändern möchte, um mit diesem Format zu arbeiten, lautet:

function _ago($tm,$rcs = 0) {
    $cur_tm = time(); 
    $dif = $cur_tm-$tm;
    $pds = array('second','minute','hour','day','week','month','year','decade');
    $lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);

    for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
        $no = floor($no);
        if($no <> 1)
            $pds[$v] .='s';
        $x = sprintf("%d %s ",$no,$pds[$v]);
        if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0))
            $x .= time_ago($_tm);
        return $x;
    }

Ich denke, in diesen ersten Zeilen versucht das Skript, etwas zu tun, das so aussieht (andere Datumsformat-Mathematik):

$dif = 1252809479 - 2009-09-12 20:57:19;

Wie würde ich vorgehen, um meinen Zeitstempel in dieses (Unix?) Format zu konvertieren?

  • mögliches Duplikat von Wie berechnet man die Differenz zwischen zwei Daten mit PHP?

    – Glavic

    18. September 2013 um 2:38 Uhr

  • Beispiel für PHP und jQuery hier freakyjolly.com/convert-date-time-to-facebook-style

    – Code-Spion

    4. Juni 2018 um 11:48 Uhr

Konvertieren des Zeitstempels in PHP vor einer Zeit z B
Ayman Hussein

function time_elapsed_string($ptime)
{
    $etime = time() - $ptime;

    if ($etime < 1)
    {
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
                );
    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
            return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ago';
        }
    }
}

  • Dies ist keine gute Lösung, da es verwendet wird 30days for monthund 12x30days for yearund aus diesem Grund wird eine ungültige Anzahl von Jahren unterhalb des Jahres <= 1978 zurückgegeben. Beispiel wo es 39 Jahre zurückgibt, aber es sollte 38 sein. Und es funktioniert auch nicht für Jahre unter 1970.

    – Glavic

    2. Oktober 2013 um 12:33 Uhr

  • Schreckliche Lösung. Warum hat dies 42 positive Stimmen und eine ausgewählte Antwort? Seit wann hat jeder Monat 30 Tage?

    – BadHorsie

    14. März 2014 um 17:22 Uhr

  • @wassimboy, könnten Sie mir bitte sagen, warum Sie meine Antwort ablehnen möchten. Wenn meine Antwort nicht gut genug ist, können Sie einen Kommentar schreiben, um sie ohne Ablehnung zu korrigieren.

    – Ayman Hussein

    22. Oktober 2014 um 9:15 Uhr

  • Ihre Antwort ist nicht gut, weil sie 30 Tage pro Monat zählt und nicht alle Monate 30 Tage haben. Lesen Sie die anderen Kommentare oben.

    – Tomás González

    4. November 2014 um 18:47 Uhr

  • Dies ist eine Funktion, um einen allgemeinen Satz zurückzugeben, wie “vor ungefähr wie langer Zeit wurde dieser Kommentar abgegeben”? Es ist nicht präzise und hat einige Nachteile, wie oben erwähnt, aber für Daten in der nahen Vergangenheit (sagen wir 30 Jahre in der nahen Vergangenheit und weniger) gibt es uns ungenauen Menschen eine Vorstellung davon, wie lange ein Ereignis zurückliegt. Hat für meine Anwendung gut funktioniert.

    – Tim Dearborn

    27. September 2015 um 13:17 Uhr

Ich weiß nicht, warum noch niemand Carbon erwähnt hat.

https://github.com/briannesbitt/Carbon

Dies ist eigentlich eine Erweiterung von php dateTime (das hier bereits verwendet wurde) und es hat: diffForHumans-Methode. Also alles, was Sie tun müssen, ist:

$dt = Carbon::parse('2012-9-5 23:26:11.123789');
echo $dt->diffForHumans();

mehr Beispiele: http://carbon.nesbot.com/docs/#api-humandiff

Vorteile dieser Lösung:

  • es funktioniert für zukünftige Daten und wird ungefähr in 2 Monaten usw. zurückkehren.
  • Sie können die Lokalisierung verwenden, um andere Sprachen zu erhalten, und die Pluralisierung funktioniert gut
  • Wenn Sie beginnen, Carbon für andere Dinge zu verwenden, wird die Arbeit mit Datteln so einfach wie nie sein.

1647072847 512 Konvertieren des Zeitstempels in PHP vor einer Zeit z B
Panama Jack

Dies ist eigentlich eine bessere Lösung, die ich gefunden habe. Verwendet jQuery, aber es funktioniert perfekt. Auch das aktualisiert sich automatisch Ähnlich wie bei SO und Facebook müssen Sie die Seite nicht aktualisieren, um die Updates zu sehen.

Dieses Plugin liest Ihre datetime attr in der <time> markieren und für Sie ausfüllen.

e.g. "4 minutes ago" or "about 1 day ago

http://timeago.yarp.com/

Ich fand Ergebnisse wie die folgenden hässlich:

1 Jahr, 2 Monate, 0 Tage, 0 Stunden, 53 Minuten und 1 Sekunde

Aus diesem Grund habe ich eine Funktion realisiert, die Pluralformen berücksichtigt, leere Werte entfernt und optional die Ausgabe kürzen kann:

function since($timestamp, $level=6) {
    global $lang;
    $date = new DateTime();
    $date->setTimestamp($timestamp);
    $date = $date->diff(new DateTime());
    // build array
    $since = array_combine(array('year', 'month', 'day', 'hour', 'minute', 'second'), explode(',', $date->format('%y,%m,%d,%h,%i,%s')));
    // remove empty date values
    $since = array_filter($since);
    // output only the first x date values
    $since = array_slice($since, 0, $level);
    // build string
    $last_key = key(array_slice($since, -1, 1, true));
    $string = '';
    foreach ($since as $key => $val) {
        // separator
        if ($string) {
            $string .= $key != $last_key ? ', ' : ' ' . $lang['and'] . ' ';
        }
        // set plural
        $key .= $val > 1 ? 's' : '';
        // add date value
        $string .= $val . ' ' . $lang[ $key ];
    }
    return $string;
}

Sieht viel besser aus:

1 Jahr, 2 Monate, 53 Minuten und 1 Sekunde

Optional verwenden $level = 2 um es wie folgt zu verkürzen:

1 Jahr und 2 Monate

Entferne das $lang Teil, wenn Sie es nur auf Englisch benötigen, oder bearbeiten Sie diese Übersetzung, um sie Ihren Bedürfnissen anzupassen:

$lang = array(
    'second' => 'Sekunde',
    'seconds' => 'Sekunden',
    'minute' => 'Minute',
    'minutes' => 'Minuten',
    'hour' => 'Stunde',
    'hours' => 'Stunden',
    'day' => 'Tag',
    'days' => 'Tage',
    'month' => 'Monat',
    'months' => 'Monate',
    'year' => 'Jahr',
    'years' => 'Jahre',
    'and' => 'und',
);

  • Von allen funktioniert dieser gut für mich. Es zeigt zwar nicht vor oder zurück, aber es funktioniert in beide Richtungen. Einfache Lösung: if ($date->invert > 0) { $ending = “to go”; } Else { $Endung = ” vor”; } Fügen Sie einfach $ending zum $string hinzu.

    – Quentin Campbell

    18. April 2018 um 14:48 Uhr


  • Die Verwendung von json-Funktionen ist hier ein großer Leistungseinbruch und völlig unnötig. Das ist keine gute Lösung.

    – Zombie

    25. Juni 2019 um 20:13 Uhr

  • @zombat Vielen Dank für Ihr Feedback. Ich habe die Zeile gegen geändert explode und array_combine.

    – mgutt

    26. Juni 2019 um 21:28 Uhr

  • Warum global? Lesen Sie bitte www.PhpTheRightWay.com.

    – AlexioVay

    1. Februar 2021 um 18:48 Uhr

993120cookie-checkKonvertieren des Zeitstempels in PHP vor einer Zeit, z. B. vor 1 Tag, vor 2 Tagen …

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy