kleines Datumsproblem
Simone
- php
0 Cheatah0 Simone0 Der Martin
0 Cheatah
0 Der Martin
0 Simone
0 迪拉斯0 wahsaga
0 Noodles
Hallo,
Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
also der 28.02.2005
Mein Versuch:
echo date('d.m.Y',mktime(0,0,0,1,31,2005)).'<br>';
// 31.01.2005
echo date('d.m.Y',mktime(0,0,0,1+1,31,2005)).'<br>';
// 03.03.2005 ist fehlerhaft
Bin auf der Suche nach einer Funktion wie z. B.
31.01.2005 + 1 Monat
Wie kann ich das am besten lösen?
Danke Simone
Hi,
Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
also der 28.02.2005
"also"? Du scheinst darin irgend eine Logik zu sehen, die mir allerdings verschlossen bleibt. Erkläre also bitte diese Logik.
Cheatah
Hi,
echo date('d.m.Y',mktime(0,0,0,1,28,2005)).'<br>'; // 28.01.2005
echo date('d.m.Y',mktime(0,0,0,1+1,28,2005)).'<br>';// = 28.02.2005
mktime addiert jeweils einen Monat zum Ausgansdatum
es sei den es ist der 31 und der Folgemoat hat kein 31 Tage.
Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.
ala 31.1 ein monat dazu nicht 31.2 sondern 28.2
Simone
Hallo,
Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.
da hilft ein kleines Array (und evtl. eine Schaltjahr-Bestimmung).
ala 31.1 ein monat dazu nicht 31.2 sondern 28.2
Aha. Und was wäre nach deiner Ansicht der 10.01. + 1 Monat? Etwa der 07.02.?
Ciao,
Martin
Hi,
echo date('d.m.Y',mktime(0,0,0,1+1,28,2005)).'<br>';// = 28.02.2005
mktime addiert jeweils einen Monat zum Ausgansdatum
nein, das macht die Addition.
es sei den es ist der 31 und der Folgemoat hat kein 31 Tage.
Bist Du sicher, dass das eine günstige Formulierung für die Gesamtheit aller Ausnahmen ist?
Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.
Es gibt PHP-Funktionen, die sich über die Zahl der Tage eines Monats im Klaren sind - Du badest gerade Deine Hände darin. Die Frage ist, was damit *passieren* soll, und das kann PHP nicht wissen. Es ist _Deine_ Aufgabe, einen Algorithmus zu definieren, der mit einem endlichen Set an Regeln aus _jedem_ Ausgangswert den Dir genehmen Endwert produziert. Dann und _erst_ dann ist es möglich, diesen Algorithmus unter Verwendung von PHP-Funktionen zu implementieren.
ala 31.1 ein monat dazu nicht 31.2 sondern 28.2
Genau wie Martin habe ich den Eindruck, dass Du nur Einzelfälle betrachtest. Es ist Dein Job, *jeden* Fall zu betrachten. So wie Du vorgehst, könntest Du auch leicht beweisen, dass jede ungerade Zahl größer 2 eine Primzahl ist:
3 ist prim, 5 ist prim, 7 ist prim, weiter mit vollständiger Induktion.
Cheatah
Hallo Simone,
Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
dabei dürfte das Hauptproblem sein, dass der Zeitbegriff "Monat" nicht klar definiert ist: Ein Monat kann ein Zeitraum von 28 bis 31 Tagen sein. Du musst dir also erstmal überlegen, welchen Zeitraum du jeweils meinst.
echo date('d.m.Y',mktime(0,0,0,1+1,31,2005)).'<br>';
// 03.03.2005 ist fehlerhaft
Wie man's nimmt. Du willst den 31.02.2005 - den gibt's aber nicht, weil der Februar nur 28 Tage hat, also normalisiert PHP das Datum. Normalerweise ist das eine tolle Eigenschaft, die man ausnutzen kann. Hier ausnahmsweise nicht.
31.01.2005 + 1 Monat
Wie kann ich das am besten lösen?
Finde heraus, wieviele Tage der Monat des Ausgangsdatums hat, und addiere genau so viele Tage zum Startdatum.
So long,
Martin
Hi, Martin
Danke Dir habe jetzt eine kleine Funktion geschrieben.
$ausgangsmonat=1;
$endmonat = 2;
$days = debug_mktime($ausgangsmonat,$endmonat);
echo date('d.m.Y',mktime(0,0,0,1,(31+$days),2005)).'<br>'; // 31.01.2005
function debug_mktime($monat_anf, $monat_end)
{
for($i=$monat_anf+1;$i<=$monat_end;$i++)
{
switch($i)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12: $tage = 31; break;
case 4: case 6: case 9: case 11: $tage = 30; break;
case 2: $tage = 28;break;
}
echo "monat $i : $tage <br>";
$days +=$tage;
}
echo "$days gesamt<br>";
return $days;
}
Ich finde das jedoch nicht optimal es muss doch
noch was besseres geben?
Simone
Hi,
Ich finde das jedoch nicht optimal es muss doch
noch was besseres geben?
so ist es... Du musst Dir nur über die Aufgabenstellung klar werden und wissen, dass PHP eine Besonderheit parat hält, nämlich den 0.Tag des Folgemonats als Äquivalent des letzten Tages des Monats. Im Code kann das dann so aussehen:
$m = 1; $d = 31; $y = 2005;
$n = mktime(0,0,0,$m+1,$d,$y);
if(getdate($n) != $m+1) $n = mktime(0,0,0,$m+2,0,$y);
echo date('d.m.Y',$n);
freundliche Grüße
Ingo
Hi,
Ingo
Ich habe es nochmal verändert getdate($n) ist ein Array
$dazu_monate= 12;
$m = 1; $d = 31; $y = 2005;
$n = mktime(0,0,0,$m+$dazu_monate,$d,$y);
$array_date = getdate($n);
if($array_date['mon'] != $m+$dazu_monate)
{
$n = mktime(0,0,0,$m+$dazu_monate+1,0,$y);
}
else
{
$n = mktime(0,0,0,$m+$dazu_monate,$d,$y);
}
echo '<br>'.date('d.m.Y',$n);
Danke Dir Du bist ein Schatz!
Hi,
case 1: case 3: case 5: case 7: case 8: case 10: case 12: $tage = 31; break;
case 4: case 6: case 9: case 11: $tage = 30; break;
case 2: $tage = 28;break;
Letzteres ist unglücklich gewählt. Schaltjahre existieren.
cu,
Andreas
Hey,
Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
also der 28.02.2005
mache nie Zeit- und Datumsgeschichten selber.
1. Es ist ein gelöstes Problem, wenn du dir selber erneut die Mühe machst, bist du nicht tugendhaft-faul genug.
2. Du hast nicht genug Ahnung, um es richtig zu machen. Nur wenige Leute sind dafür schlau genug, und selbst die hauen subtile Bugs rein und es dauert einige Zeit, bis der Code stabil und fehlerfrei ist.
Daher: http://pear.php.net/package/Date
Rufe die Funktion nextDay 28mal auf. Wenn dir das auch mächtig bescheuert vorkommt, geht's dir wie mir.
hi,
Daher: http://pear.php.net/package/Date
Rufe die Funktion nextDay 28mal auf. Wenn dir das auch mächtig bescheuert vorkommt, geht's dir wie mir.
Warum schlägst du's dann vor?
Zumal damit immer noch das Problem (bzw. die Aufgabe) für die Fragerin höchstvermutlich ungelöst im Raum steht, wie sie herausbekommt, dass in diesem Falle die Funktion genau 28 Mal aufzurufen wäre.
gruß,
wahsaga
Hi Simone,
ich kenne mich leider in PHP nicht aus. Aber ich nehme an, dass es in PHP genauso Datumsfunktionen geben muss (wie eigentlich in jeder Hochsprache).
Losgelöst von PHP würde ich das Problem folgendermaßen lösen:
Ich hole mir vom Ausgangsdatum den ersten des Monats (1.1.). Zu diesem Datum addiere ich zwei Monate hinzu (1.3.) und ziehe hiervon einen Tag ab, dann erhalte ich den 28.2. bzw den 29.2.
Ich habe dir den Code stellvertretend für PHP in SQL und VB.NET aufgeschrieben. Vielleicht kannst du dieses Muster ja in PHP nachbauen
T-SQL:
-- temporäre Variablen
DECLARE @LAST_OF_MONTH datetime
DECLARE @FIRST_OF_MONTH datetime
DECLARE @TWO_MONTHS_ADDED datetime
DECLARE @TARGET_DATE datetime
select @LAST_OF_MONTH = '20050131' -- Startdatum
-- ersten des Monats berechnen
select @FIRST_OF_MONTH = DATEADD(day, (- DATEPART(DAY,@LAST_OF_MONTH) +1), @LAST_OF_MONTH)
-- zwei Monate addieren
select @TWO_MONTHS_ADDED = DATEADD(month, 2, @FIRST_OF_MONTH)
-- einen Tag abziehen und voilà...
select @TARGET_DATE = DATEADD(day, -1, @TWO_MONTHS_ADDED)
VB.Net:
Dim GivenDate As New Date(2005, 1, 31)
Dim SearchedDate As Date = GivenDate.AddDays(1 - GivenDate.Day).AddMonths(2).AddDays(-1)
Dieses Muster ist völlig losgelöst von jedem Schaltjahr, da die Datumsfunktionen für dich den Rest erledigen.
Hoffe ich konnte dir weiterhelfen
Grüße aus dem wilden Süden
Noodles