PHP Arbeiten mit Timestamp

Benutzer-42

abgemeldet
20 April 2006
22.497
1.328
So, wieder das nächste Problem ...

Im vorhergegangenen Schritt hatte ich ja schon den timestamp mitgeloggt, wenn ich etwas in die DB ein trage.

Nun will ich aber, dass ich zB News aus einer Datenbank auslesen kann, und zwar der letzten 7 Tage, wobei ich diese aber nach dem Wochentag sortiert dann ausgeben will

also erst alle von heute, dann von gestern, dann vorgestern --- bis eben die letzte Woche voll ist, aber leider scheine ich wieder vor lauter Scheuklappen das Tor nicht zu sehen, obwohl ich mir nun schon zigmal die Erklärungen zum Timestamp angeschaut habe ...

Wie also kann ich das am besten realisieren?
 
...

1 h = 60 Sek x 60 Min = 3600 Sek
24 h = 3600 x 24 = 86400
7 Tage = 86400 x 7 = 604800

Datenbankabfrage so stellen, dass alle Einträge der aktuellen Timestamp bis Timestamp - 604800 ausgelesen werden.
 
das bringt aber leider auch keine richtigen Ergebnisse

denn wenn ich zB morgens um 0100 den Timestamp minus 7 Tage rechne, bin ich schon am achten Tag, will aber zB nur von den letzten 7 Tagen anzeigen, und dann sortiert nach dem jeweiligen Wochentag

EDIT: mal ein Beispiel der Anwendung:
https://www.nexgam.de/playstation.html
 
Hallo,

per date() 7 Tage zurück, dann per mktime() timestamp daraus, dann die DB-Abfrage per ORDER BY....

Die einzelnen Tage kannst du dann wieder per Rechnung (86400/Tag) trennen...

Gruss
nixname
 
Zuletzt bearbeitet:
wäre dazu diese Funktion nutzenswert?

echo strtotime ("+1 day") . "\n";

anstatt +1 day, käme dann halt +Variable day
die Variable käme in eine Schleife, in der dann alles ausgegeben wird, was eben dann -1 Tag, -2 Tage, etc.. bis -7 Tage wäre

EDIT: oder besser dieses Konstrukt hier?:

PHP:
  <?php
$morgen        = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
$letztermonat  = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
$naechstesjahr = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);
?>
 
Hmmm,

viele Wege führen nach Rom.
Ich selber würde es wohl eher mit deinem Ansatz Nr. 2 lösen:

PHP:
$vorsiebentage  = mktime(0, 0, 0, date("m"), date("d")-7,   date("Y"));

Wie du jetzt die einzelnen Tage differenziert, bleibt dir überlassen.
Entweder du machst ein SELECT über alle 7 Tage und filterst dann per while die einzelen Tage oder du machst 7 SELECTs (hierbei wäre BETWEEN dein Freund..)

Gruss
nixname
 
Zuletzt bearbeitet:
ok, ich werde das mal morgen versuchen .. wäre wieder ein kleiner Schritt, der ein großes Problem löst

vielleicht sollte ich mir mal zum Testen einfach eine Testdatenbank einspielen
 
Hallo nochmal,

und was machst du am 4. Januar 2010? ;)

ich würde eher in die Richtung was machen:
PHP:
$old = time() - 7 * 24 * 60 * 60;
$vorsiebentage  = mktime(0, 0, 0, date("m", $old), date("d", $old), date("Y", $old));

Die quick'n dirty Aussage von mir auch funktionstüchtig am 04.01.2010...

Wenn man es noch anders machen will, wäre folgender Denkansatz vll. korrekt:
  • aktuellen Tag ermitteln:
    PHP:
    $jetzt = mktime(0,0,0,date("m"),date("d"),date("Y"));
    -> damit habe ich HEUTE um 00.00.00
  • jetzt vor sieben Tage abrechnen:
    PHP:
    $alt_1 = $jetzt - 7*24*60*60;
    -> damit habe ich JETZT minus 7 Tage Zeit 00.00.00
  • Tagende ermitteln:
    PHP:
    $alt_2 = $alt_1 + 86399;

Wie du sicher siehst, eigentlich das gleiche Prinzip wie deins; tja, wie ich schon sagte: bei PHP führen viele Wege nach Rom...

So, genug Änfangerkurs :evil:

Gruss
nixname
 
Tatsache, PHP ist viel zu fehlertolerant.
Sag das nicht; zumindest nicht für dieses Beispiel.

Wenn du ne Implementierung für mktime() schreiben würdest, würdest du auch nur
PHP:
if($days < 1 || $days > $maxdays) return null;
// ...
an den Anfang schreiben. Diese zusätzliche Funktionalität wird wahrscheinlich (hab aufm Notebook den Source grad ned zur Hand) nur Abfallprodukt davon sein, dass man sich die Parameterprüfung sparen wollte.
...oder es ist sogar beabsichtigt :think:
 
Nachtrag zu mktime():
Wenns interessiert, php_mktime() (/ext/date/php_date.c) ruft die Funktion timelib_update_ts() (/ext/date/lib/tm2unixtime.c) auf, die einfach nur alles zusammenzählt.

Für die Tage pro Monat gibts Arrays, weswegen hier die Parameter gecheckt werden und diese Über- und Unterläufe separat bearbeitet werden (do_range_limit_days_relative(), do_range_limit_days()).

Fazit: beabsichtigtes Verhalten.

(Infos aus Snapshot-Build PHP 6 vom 20.1.2010 21:30 Uhr)