Suchst du etwas wie strtotime() ?
Es gibt ja so Geburtsrechner im Netz, die z.B. nach einer Datumseingabe alles mögliche berechnen. Bisher habe ich das nur mit javascript gefunden.
Meine Frage ist, ist das auch mit php möglich und wenn ja, wie?
Datum (frei "wählbar") plus xTage (fester Wert) = Datum
Tanja
Suchst du etwas wie strtotime() ?
Ich denke mit
date_add
geht das.
Grüße aus dem Odenwald
Thomas
#.Viele Grüße - Andreas
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
PHP Tutorials und kostenlose Scripts gibt's bei phpBuddy.eu
Follow phpBuddy on Twitter
LTFB - anfängerfreundliche Tutorials
.
Grüße aus dem Odenwald
Thomas
habe versucht mich da durch zu wuscheln, aber irgendwie hatte ich das Gefühl, es geht immer nur vom aktuellen Datum.
Also weiter gegoogelt, einen englisch-Übersetzer genommen und weiter gesucht.
Das ist mein Ergebnis:
Ob das ganze validiert, weiß ich noch nicht, ist erstmal der nackige Rechner. Aber wenigstens ohne Tabellen und ohne js.Code:<?php /* This calculator is your for free by Calendarscripts.info. You have no obligations for anything - you can modify, redistribute, sell it or whatever you want to do. We will appreciate if you don't remove the link at the bottom, but that's not required. */ /* Feel free to modify the CSS and the texts below. - no problem at all. Just don't touch the PHP code or the specual codes which are surrounded with %% unless you know what you are doing. */ ?> <style type="text/css"> .calculator_table { font-size:11px; font-family:verdana, arial, sans-serif; border:2pt solid #4444FF; padding:25px; width:400px; height:200px; } </style> <?php if(!empty($_POST['calculator_ok'])) { //last cycle date $date="$_POST[dateyear]-$_POST[datemonth]-$_POST[dateday]"; //convert to time $lasttime=mktime(0,0,0,$_POST[datemonth],$_POST[dateday],$_POST[dateyear]); //first fertile day $firstdaytime=$lasttime + $_POST[days]*24*3600 - 35*24*3600; $firstday=date("d.m.Y",$firstdaytime); //last fertile day $lastdaytime=$lasttime + $_POST[days]*24*3600 - 14*24*3600; $lastday=date("d.m.Y",$lastdaytime); //have to adjust due date? $diff=$_POST[days] - 63; //due date $date + 63 days $duedatetime=$lasttime + 63*24*3600 + $diff*24*3600; $duedate=date("d.m.Y",$duedatetime); ?> <div class="calculator_table"> Die folgenden Daten sind unverbindlich:<br /><br /> Ab dem <?=$firstday?> verfärben sich die Zitzen <br /> und ab dem <?=$lastday?> sollten die Kittenbewegungen spürbar sein.<br > Ausgehend von der angegebenen Tragzeit ist der Geburtstermin am <strong><?=$duedate?></strong><br /><br /> <p align="center"><input type="button" value="erneut berechnen!" onclick="javascript:history.back();"></p> </div> <?php } else { //the calculator comes here ?> <div class="calculator_table"> <form method="post"> Der Decktag war:<br /><br /> <?=date_chooser("date",date("Y-m-d"))?><br><br> Tragzeit in Tagen: <select name="days"> <?php for($i=55;$i<=75;$i++) { if($i==63) $selected='selected'; else $selected=''; echo "<option $selected value='$i'>$i</option>"; } ?> </select> <p align="center"><input type="submit" name="calculator_ok" value="berechnen"></p> </form> </div> <?php } //to print a date chooser - get name and value in mysql date format function date_chooser($name,$value="") { $months=array('','Januar','Februar','März','April','Mai','Juni','Juli','August', 'September','Oktober','November','Dezember'); if(empty($value)) $value=date("Y-m-d"); $parts=explode("-",$value); $day=$parts[2]+0; $month=$parts[1]+0; $year=$parts[0]; $chooser=""; $chooser.="<select name=".$name."month>"; for($i=1;$i<=12;$i++) { if($i==$month) $selected='selected'; else $selected=''; $chooser.="<option $selected value=$i>$months[$i]</option>"; } $chooser.="</select> / "; $chooser.="<select name=".$name."day>"; for($i=1;$i<=31;$i++) { if($i==$day) $selected='selected'; else $selected=''; $chooser.="<option $selected>$i</option>"; } $chooser.="</select> / "; $chooser.="<select name=".$name."year>"; for($i=(date("Y")-1);$i<=2050;$i++) { if($i==$year) $selected='selected'; else $selected=''; $chooser.="<option $selected>$i</option>"; } $chooser.="</select> "; return $chooser; } ?>
Tanja
Ich habe mir jetzt ehrlich gesagt den kompletten Code nicht genau angeguck - hole ich nach
Aber prinzipiell kannst du strtotime() als zweiten Parameter einen Timestamp des Datums übergeben, von dem aus du rechnen willst.
Wenn du Beispielsweise 2 Monate, 1 Woche und 4 Tage zum 12.03.2006 hinzurechnen willst, sähe der Code so aus:
PHP-Code:
$newdate = strtotime('+2 months +1 week +4 days', strtotime('2006-03-12'));
// ### Wir bekommen einen UNIX-Timestamp zurück,
// ### es kann also mit date() schöner ausgegeben werden:
echo date('d.m.Y', $newdate);
geht bestimmt in viel schöner und einfacher, wenn frau es kann. Ich kann´s aber leider (noch) nicht, und weiß nicht, wo wann welche Abfrage hinkommt und wie ich das ganze noch in ein entsprechendes Formular packe. Bin vor kurzem erst von Frontpage und Tabellen "umgesteigen" auf valides xhtml mit css; habe dabei auf alle bisherigen javascripte durch ergoogeltes php ersetzt.
Tanja
validieren tut´s auch nicht; Fehlermeldungen, die ich nicht allein lösen kann, sind diese:
Anführungsstriche fehlen: Attribute müssen in Anführungsstriche eingeschlossen sein.
Fehlerstelle:
<select name=datemonth><option value=1>Januar</option><option value=2>Febr ...
(mehrfach)
und
Der Name und der VI Begrenzer können nur dann entfallen, wenn SHORTTAG YES spezifiziert ist
Fehlerstelle:
<option >2009</option><option selected>2010</option><option >2011</option><o ...
auch mehrfach
Geändert von TanjaP. (28.03.2010 um 17:41 Uhr)
Es müsste heißen:
<select name="datemonth">....
und
<option value="2">....
was damit im eigentlichen Sinne gemeint ist, hatte ich schon verstanden (bin nur fast ganz blöd) aber wo finde ich das in meinem Script?
Tanja
Wenn ich die Frage richtig verstanden habe, kommt recht einfach über timestamp berechnungen hin.
So in der Art:
PHP-Code:<?php
# Daten aus dem Formular, natürlich vorher prüfen...
$user_year = 1980; #Durch überprüften $_POST ersetzen
#z.B. $user_year = (is_numeric($_POST['blubb']) && strlen($_POST['blubb']) == 4) ? $_POST['blubb']:false;
$user_month = 6;
$user_day = 1;
$pluseintagundeineminute = 86460; #Der Timestamp rechnet in Sekunden... Also hier ist der Punkt wo du zu deinem Datum einen Festen Wert addieren kanst... musst es nur in Sekunden umrechnen...
$user_timestamp = mktime(0, 0, 0, $user_month, $user_day, $user_year);
$new_timestamp = $user_timestamp + $pluseintagundeineminute;
$newdate = date('d.m.Y', $new_timestamp);
?>
Geändert von nerdlikeyou (01.04.2010 um 16:35 Uhr)
super, sieht weniger kompliziert aus wie meines. Ich versuch´s mal einzubauen.
In dem obigen Script haben einige /"... "/ gefehlt, valide ist es jetzt, aber tierisch lang.
Tanja
Gerne.
Als Tipp: Pack das ganze in zwei Funktionen.
1. Funktion: Formular überprüfen
function ueberpruefen() {
if (irgendwas ist schief gelaufen oder jemand versucht dein Formular zu missbrauchen) {
echo "irgendwas ist schief gelaufen";
return array(false);
}
else {
return array(true, $m, $d, $y)
}
}
$wertaus_ueberpruefen = ueberpruefen();
2. Funktion
function datum_berechnen ($wertaus_ueberpruefen) {
if($wertaus_ueberpruefen[0])
... berechne Datum
}
else {... nix gibts ...}
Und ja da fehlt n Haufen, aber du sollst ja auch selber drauf kommen...
momentan hab ich so aus dem meinem Script, das der User das Datum nur aussuchen kann. Wäre damit eine Überprüfung nicht hinfällig?
Momentan sieht mein Code so aus :
und für die Berechnung diverser Daten (entsprechend angepasst)<?=date_chooser("date",date("d-m-Y"))?><br /><br />
Tragzeit in Tagen: <select name="days">
<?php
for($i="55";$i<="75";$i++)
{
if($i==63) $selected="selected=\"selected\"";
else $selected="";
echo "<option $selected value=\"$i\">$i</option>";
}
?>
</select></p>
<p><input type="submit" name="calculator_ok" value="berechnen"></input></p>
</form>
</div>
<?php
}
$chooser.="<select name=\"".$name."month\">";
//to print a date chooser - get name and value in mysql date format
function date_chooser($name,$value="")
{
$months=array("",'Januar','Februar','März','April','Mai','Juni','Juli','August',
'September','Oktober','November','Dezember');
if(empty($value)) $value=date("d-m-Y");
$parts=explode("-",$value);
$day=$parts[2]+0;
$month=$parts[1]+0;
$year=$parts[0];
$chooser="";
$chooser.="<select name=\"".$name."day\">";
for($i=1;$i<=31;$i++)
{
if($i==$day) $selected="selected=\"selected\"";
else $selected="";
$chooser.="<option $selected>$i</option>";
}
$chooser.="</select> . ";
$chooser.="<select name=\"".$name."month\">";
for($i=1;$i<=12;$i++)
{
if($i==$month) $selected="selected=\"selected\"";
else $selected="";
$chooser.="<option $selected value=\"$i\">$months[$i]</option>";
}
$chooser.="</select> . ";
$chooser.="<select name=\"".$name."year\">";
for($i=(date("Y")-1);$i<=2050;$i++)
{
if($i==$year) $selected="selected=\"selected\"";
else $selected="";
$chooser.="<option $selected>$i</option>";
}
$chooser.="</select> ";
return $chooser;
}
?>
$duedatetime=$lasttime + 63*24*3600 + $diff*24*3600;
$duedate=date("d.m.Y",$duedatetime);
In "Action" ist das Script hier: http://www.undercover-coons.de/time.php
Ist die von Dir eingesetzte Variante (mit timestamp und so) vorteilhafter, wenn ja, warum?
Tanja
Wenn er nur aussuchen kann, und damit ein "normaler" User eigentlich nix falsch machen kann, kannst du dir Fehlermeldungen sparen. Überprüfen würd ich die Eingaben trotzdem, da man von jedem x-beliebigen Html-Formular aus Irgendwelche $_POST-Daten schicken kann die dann NICHT durch drop-down-Boxen vordefiniert sind und theoretisch alles mögliche enthalten können.
Ich könnte z.B. auf meinem Rechner eine html-Datei liegen haben und im <form>-tag das action auf "http://www.undercover-coons.de/time.php" stellen und schon kann ich jeden beliebigen input-typ verwenden - solange ich ihm den richten namen zuweise wird php das so schlucken...
Ob du jetzt mit string to time oder timestamp arbeitest, ist in deinem Fall ziemlich egal. Ich find auch das PHP unten teilweise ziemlich aufgebläht... Warum sollte man z.B. die Monate dynamisch erzeugen lassen??? Ein Jahr hat immer die selben 12 Monate, sowas könnte man einfach in HTML statisch reinschreiben...
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)