# 1. und letzten Tag eines Monats mit timestamp ausgeben.



## ciberjoerg (3. Mai 2010)

Ich versuche gerade einen Eventkalender zu schreiben, doch da komm ich schon an das größte problem, wie bekomme ich die Timestamp eines monats herraus?

```
<?php
  $monate = array(1=>"Jan",
                  2=>"Feb",
                  3=>"M&auml;rz",
                  4=>"Apr",
                  5=>"Mai",
                  6=>"Jun",
                  7=>"Jul",
                  8=>"Aug",
                  9=>"Sep",
                  10=>"Okt",
                  11=>"Nov",
                  12=>"Dez");
  $monat = date("n");
  echo "<a href='?month=0'>".$monate[$monat]."</a> | <a href='?month=1'>".$monate[$monat+1]."</a> | <a href='?month=2'>".$monate[$monat+2]."</a> | <a href='?month=3'>".$monate[$monat+3]."</a> | <a href='?month=4'>".$monate[$monat+4]."</a>";
  ?>
```
So lese ich die aktuellen Monate aus. aber die timestamp benötige ich für die Datenbankabfrage.
bei month 0 soll die aktuelle timestamp des Heutigen Tags 0 uhr bis ende des aktuellen Monats ausgelesen werden.

Wie ich die sql abfrage schreibe ist mir bekannt.
Ich benötige nur noch die Timestamp vom 1. Tag des Monats date("n")+1 bis +4   0 Uhr    und Letzten Tag date("n") bis +4 23:59:59:99 Uhr.


----------



## Dr Dau (4. Mai 2010)

Hallo!

Ich hoffe ich habe Dich richtig verstanden.....

```
<?php
date_default_timezone_set("Europe/Berlin");

$monat = date("n")+1;

$timestamp_1 = strtotime("2010-".$monat."-1");
$timestamp_2 = strtotime("2010-".$monat."-1 +1 month -1 second");

$timestamp_3 = strtotime("2010-".$monat."-1 +1 month");
$timestamp_4 = strtotime("2010-".$monat."-1 +2 months -1 second");

$timestamp_5 = strtotime("2010-".$monat."-1 +2 months");
$timestamp_6 = strtotime("2010-".$monat."-1 +3 months -1 second");

$timestamp_7 = strtotime("2010-".$monat."-1 +3 months");
$timestamp_8 = strtotime("2010-".$monat."-1 +4 months -1 second");

echo date("d.m.Y - H:i:s", $timestamp_1)."<br>";
echo date("d.m.Y - H:i:s", $timestamp_2)."<br>";

echo date("d.m.Y - H:i:s", $timestamp_3)."<br>";
echo date("d.m.Y - H:i:s", $timestamp_4)."<br>";

echo date("d.m.Y - H:i:s", $timestamp_5)."<br>";
echo date("d.m.Y - H:i:s", $timestamp_6)."<br>";

echo date("d.m.Y - H:i:s", $timestamp_7)."<br>";
echo date("d.m.Y - H:i:s", $timestamp_8)."<br>";
?>
```
Du musst aber noch prüfen was bei einem Jahreswechsel passiert (dazu hatte ich keine Lust ).

Gruss Dr Dau


----------



## Sven Mintel (4. Mai 2010)

Moin,

Mach es gleich im Query.
Falls du MySQL verwendest, gibt es da etwas Feines, LAST_DAY()


----------



## ciberjoerg (4. Mai 2010)

Vielen dank DR DAU genau das hab ich gemeint^^

Das mit dem Last_day() schau ich mir mal an.


----------



## ciberjoerg (4. Mai 2010)

So für alle die sich auch mal einen Eventkallender basteln wollen und vor dem gleichen Problem sind:


```
<?php
        if($_GET['month']== true){
        $month=$_GET['month'];
        }
        else{
        $month=date("n");
        }
  $monate = array(1=>"Jan",
                  2=>"Feb",
                  3=>"M&auml;rz",
                  4=>"Apr",
                  5=>"Mai",
                  6=>"Jun",
                  7=>"Jul",
                  8=>"Aug",
                  9=>"Sep",
                  10=>"Okt",
                  11=>"Nov",
                  12=>"Dez",
                  13=>"Jan", //ab hier wird für die monatsanzeige im link das neue jahr aufgelistet. ginge sicher eleganter
                  14=>"Feb",
                  15=>"M&auml;rz",
                  16=>"Apr");
  
  
  $monat = date("n")+$month;
  $smonat = date("n");
  $navi= date("n"); // 1. monat der angezeigt wird
  
  if($_GET['yr'] == "1"){
  $year = date("Y")+1;
  }
  else{
      $year = date("Y");
  }
//Folgende funktionen müssen pro monat wiederholt werden hier im beispiel insg. 5 monate
// 2. monat der angezeigt wird
  if(date("n")+1 <= "12"){  //überprüfung für arrays der tagesanzeige. ist date("n")+1 kleiner als 12 oder bereits 13?
  $navi1= date("n")+1;
  $yr1="0";
  }
  else{
      $navi1= date("n")+1-12;    //wenn das ergebniss 13 ist rechne 12 ab und füge dem jahr 1 zu um einen jahreswechsel zu gewärleisten.
      $yr1="1";
      }
// 3. monat der angezeigt wird
  if(date("n")+2 <= "12"){      
  $navi2= date("n")+2;
  $yr2="0";
  }
  else{
      $navi2= date("n")+2-12;
      $yr2="1";
  }
// 4. monat der angezeigt wird
  if(date("n")+3 <= "12"){
  $navi3= date("n")+3;
  $yr3="0";
  }
  else{
      $navi3= date("n")+3-12;
      $yr3="1";
  }
// 5. monat der angezeigt wird
  if(date("n")+4 <= "12"){
  $navi4= date("n")+4;
  $yr4="0";
  }
  else{
      $navi4= date("n")+4-12;
      $yr4="1";
  }

  
  echo "<a href='?month=$navi'>".$monate[$smonat]."</a> | <a href='?month=$navi1&yr=$yr1'>".$monate[$smonat+1]."</a> | <a href='?month=$navi2&yr=$yr2'>".$monate[$smonat+2]."</a> | <a href='?month=$navi3&yr=$yr3'>".$monate[$smonat+3]."</a> | <a href='?month=$navi4&yr=$yr4'>".$monate[$smonat+4]."</a>";

date_default_timezone_set("Europe/Berlin");

//$monat = date("n")+1;

$timestamp_1 = strtotime($year."-".$month."-1");
$timestamp_2 = strtotime($year."-".$month."-1 +1 month -1 second");

?>
```


----------



## Yaslaw (4. Mai 2010)

Ein wenig komplex deine Lösung. Das folgende macht etwa dasselbe... 


```
setlocale(LC_TIME, "de_DE");

$date = time();
$naviSize = 5;

$monthNamesDE = array(1=>"Jan", 2=>"Feb", 3=>"M&auml;rz", 4=>"Apr", 5=>"Mai", 6=>"Jun", 
                        7=>"Jul", 8=>"Aug", 9=>"Sep", 10=>"Okt", 11=>"Nov", 12=>"Dez");

for ($i = 0; $i < $naviSize; $i++){
    $dates[] = strtotime("+{$i} Month", $date);
}

$htmls = array_map('getNaviLink', $dates);
echo implode(' | ', $htmls);


function getNaviLink($date){
    //Je nach System ghet das Formatieren mit %b trotz setlocale nicht sauber. Darum die Übersetzung mit
    //einer eigenen Liste
    $monthName = $GLOBALS["monthNamesDE"][date('n', $date)];
    return strftime("<a href='?month=%m&yr=%Y'>{$monthName}</a>", $date);    
}
```


----------



## Dr Dau (4. Mai 2010)

ciberjoerg hat gesagt.:


> So für alle die sich auch mal einen Eventkallender basteln wollen und vor dem gleichen Problem sind:


date_default_timezone_set() muss aber gesetzt werden bevor eine Datum-/Zeitfunktion genutzt wird.
So wie Du es jetzt gemacht hast (mittendrin) wird u.U. die Zeitzone während der Berechnung geändert..... wass dann zu einem fehlerhaften Ergebnis führen würde.


----------

