PHP Datum in der Zukunft berechnen

maxbauer

Member
ID: 72515
L
18 Februar 2010
12
0
Hallo,

wie ist es mit PHP möglich ein Datum in der Zukunft zu berechnen. Ich habe also ein Startdatum und möchte wissen welches Datum zum Beispiel 10 Jahre später ist. Wie ist das möglich?
 
Zuletzt bearbeitet von einem Moderator:
Geht noch viel einafcher (und performanter)

Ich habe also ein Startdatum und möchte wissen welches Datum zum Beispiel 10 Jahre später ist.
PHP:
# von jetzt in 10 Jahren
$timestamp = strtotime('+10 years');
# [...]
# von $time in 10 Jahren
$timestamp = strtotime('+10 years',$time);
 
Es müsste aber noch einfacher gehen:
PHP:
$timestamp = strtotime("11 September 2001 12:34:56 +23 years 42 days 666 seconds");
echo date('d.m.Y h:i:s', $timestamp);
// Ausgabe: 23.10.2024 12:46:02
strtotime() kann so einiges!
 
Es müsste aber noch einfacher gehen:
PHP:
$timestamp = strtotime("11 September 2001 12:34:56 +23 years 42 days 666 seconds");
echo date('d.m.Y h:i:s', $timestamp);
// Ausgabe: 23.10.2024 12:46:02
strtotime() kann so einiges!

Kann ich es auch so machen?
PHP:
$timestamp = strtotime("$tag $monat $jahr +$zukunft_jahr years $zukunft_monat months");
echo date('d.m.Y', $timestamp);

In den Variablen sind die jeweiligen Daten gespeichert.
z.B.:
$tag = 03
$monat = April
$jahr = 1976
$zukunft_jahr = 14
$zukunft_monat = 6
 
Allgemeine Vorgehensweise:

  • :rtfm:
  • Wenn nix im Manual steht, ausprobieren.
  • Unabhängig davon kann man immer im Code nachsehen
PHP:
static timelib_relunit const timelib_relunit_lookup[] = {
    { "sec",         TIMELIB_SECOND,  1 },
    { "secs",        TIMELIB_SECOND,  1 },
    { "second",      TIMELIB_SECOND,  1 },
    { "seconds",     TIMELIB_SECOND,  1 },
    { "min",         TIMELIB_MINUTE,  1 },
    { "mins",        TIMELIB_MINUTE,  1 },
    { "minute",      TIMELIB_MINUTE,  1 },
    { "minutes",     TIMELIB_MINUTE,  1 },
    { "hour",        TIMELIB_HOUR,    1 },
    { "hours",       TIMELIB_HOUR,    1 },
    { "day",         TIMELIB_DAY,     1 },
    { "days",        TIMELIB_DAY,     1 },
    { "week",        TIMELIB_DAY,     7 },
    { "weeks",       TIMELIB_DAY,     7 },
    { "fortnight",   TIMELIB_DAY,    14 },
    { "fortnights",  TIMELIB_DAY,    14 },
    { "forthnight",  TIMELIB_DAY,    14 },
    { "forthnights", TIMELIB_DAY,    14 },
    { "month",       TIMELIB_MONTH,   1 },
    { "months",      TIMELIB_MONTH,   1 },
    { "year",        TIMELIB_YEAR,    1 },
    { "years",       TIMELIB_YEAR,    1 },

    { "monday",      TIMELIB_WEEKDAY, 1 },
    { "mon",         TIMELIB_WEEKDAY, 1 },
    { "tuesday",     TIMELIB_WEEKDAY, 2 },
    { "tue",         TIMELIB_WEEKDAY, 2 },
    { "wednesday",   TIMELIB_WEEKDAY, 3 },
    { "wed",         TIMELIB_WEEKDAY, 3 },
    { "thursday",    TIMELIB_WEEKDAY, 4 },
    { "thu",         TIMELIB_WEEKDAY, 4 },
    { "friday",      TIMELIB_WEEKDAY, 5 },
    { "fri",         TIMELIB_WEEKDAY, 5 },
    { "saturday",    TIMELIB_WEEKDAY, 6 },
    { "sat",         TIMELIB_WEEKDAY, 6 },
    { "sunday",      TIMELIB_WEEKDAY, 0 },
    { "sun",         TIMELIB_WEEKDAY, 0 },

    { "weekday",     TIMELIB_SPECIAL, TIMELIB_SPECIAL_WEEKDAY },
    { "weekdays",    TIMELIB_SPECIAL, TIMELIB_SPECIAL_WEEKDAY },
    { NULL,          0,          0 }
};
Quelle: PHP 5.2.9 /ext/date/lib/parse_date.c, ll. 183-225
 
Kann es sein das ich Probleme bekomme, wenn das Datum hinter dem 01.01.1970 liegt?
Wenn ich zum Beispiel vom 01.01 1960 vier Jahre addieren möchte, dann kommt immer der 01.01.1970 bei mir raus.
 
Das is logisch, weil du dann vor Unixnull bist und die Funktion nicht korrekt arbeitet. In diesem Fall musst du halt selbst Hand Hirn anlegen ;)
 
Ok. habe das Problem gelöst. Habe mit deutschen Monatsnamen anstatt mit englischen gearbeitet. ^^

Habe aber noch eine Frage. Ich habe eine Switch Anweisung in der ich die Monate abfrage. Funktioniert soweit auch, nur gibt es bei der Anweisung "08" und "09" Probleme. Könnt ihr dort etwas sehen woran es liegen könnte?

PHP:
	switch($arr_geburtstag[1])
	{

		case 01: $monat = "January";
		break;
		case 02: $monat = "February";
		break;
		case 03: $monat = "March";
		break;
		case 04: $monat = "April";
		break;
		case 05: $monat = "May";
		break;
		case 06: $monat = "June";
		break;
		case 07: $monat = "July";
		break;
		case 08: $monat = "August";
		break;
		case 09: $monat = "Septmeber";
		break;
		case 10: $monat = "October";
		break;
		case 11: $monat = "November";
		break;
		case 12: $monat = "December";
		break;
	}
	echo $monat;
 
Bist du sicher, dass überhaupt eine 08 oder 09 reinkommt?
Wofür eigentlich die switch-Anweisung? Du könntest das Datum doch auch per date() wandeln...
 
Ja habs mir vorher mal ausgeben lassen, kommt rein.
Hab den Fehler grad entdeckt. Habe die case Auswahl in "09" gepackt dann funktioniert es. Komisch das es nur bei 08 und 09 sich ausgewirkt hat.

Liegt daran, dass PHP Zahlen mit einer vorangestellten 0 als Oktalzahlen interpretiert...

PHP:
if(01337 == 735) echo 'OMG? ';
if(0x42 == 66) echo 'WTF!';
// Output: OMG? WTF!
 
Wieso wandelst du die überhaupt um? Wenn es an der richtigen Stelle steht kann strtotime doch auch mit Monatszahlen arbeiten?
 
Gibt es denn eine Möglichkeit ein Datum weiter als 2038 zu berechnen? Durch den 32bit Integer ist dies ja das höchste Jahr das der Unix Timestamp berechnen kann. Wie kann man dieses Problem umgehen?