<?php

ini_set("date.timezone", "Europe/Berlin");

$d = new DateTime("now", new DateTimeZone("Europe/Berlin"), true);

$d2 = $d->add(DateInterval::createFromDateString("1 month"));
$d3 = $d->sub(DateInterval::createFromDateString("1 month"));

echo $d2->format('d.m.Y') . " " . $d->format('d.m.Y') . " " . $d3->format('d.m.Y');
echo "\nd===d2: ";
echo $d === $d2 ? "equals" : "new";
echo "\nd===d3: ";
echo $d === $d3 ? "equals" : "new";
echo "\n";

$begin = new DateTime( '2007-12-31',  new DateTimeZone("Europe/Berlin"), true);
$end = new DateTime( '2009-12-31 23:59:59',  new DateTimeZone("Europe/Berlin"), true);

$interval = DateInterval::createFromDateString('last thursday of next month');
$period = new DatePeriod($begin, $interval, $end, DatePeriod::EXCLUDE_START_DATE);

$dates = array();
foreach ( $period as $dt ) {
    $newdate = $dt->add(DateInterval::createFromDateString("1 month"));
    echo "Iterator: ";
    echo $newdate === $dt ? "equal" : "new";
    echo "\n";
}


