Skip to content

Commit

Permalink
Respect potential difference in TimeZones
Browse files Browse the repository at this point in the history
  • Loading branch information
Menno Holtkamp committed Apr 15, 2014
1 parent bbd1b74 commit cbde1b5
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
4 changes: 3 additions & 1 deletion src/Cron/CronExpression.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,9 @@ public function isDue($currentTime = 'now')
$currentDate = date('Y-m-d H:i');
$currentTime = strtotime($currentDate);
} elseif ($currentTime instanceof \DateTime) {
$currentDate = $currentTime->format('Y-m-d H:i');
$currentDate = clone $currentTime;
$currentDate->setTimezone(new \DateTimeZone(date_default_timezone_get())); //Ensure time in 'current' timezone is used
$currentDate = $currentDate->format('Y-m-d H:i');
$currentTime = strtotime($currentDate);
} else {
$currentTime = new \DateTime($currentTime);
Expand Down
31 changes: 31 additions & 0 deletions tests/Cron/CronExpressionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,37 @@ public function testIsDueHandlesDifferentDates()
$this->assertTrue($cron->isDue('now'));
$this->assertTrue($cron->isDue(new DateTime('now')));
$this->assertTrue($cron->isDue(date('Y-m-d H:i')));

$cron = CronExpression::factory('0 15 * * 2');
$this->assertFalse($cron->isDue(new DateTime('2014-04-15 15:00', new \DateTimeZone('UTC'))));
$this->assertTrue($cron->isDue(new DateTime('2014-04-15 15:00', new \DateTimeZone('Europe/Amsterdam'))));
}

/**
* @covers Cron\CronExpression::isDue
*/
public function testIsDueHandlesDifferentTimezones()
{
$cron = CronExpression::factory('0 15 * * 3'); //Wednesday at 15:00
$date = '2014-01-01 15:00'; //Wednesday
$utc = new \DateTimeZone('UTC');
$amsterdam = new \DateTimeZone('Europe/Amsterdam');
$tokyo = new \DateTimeZone('Asia/Tokyo');

date_default_timezone_set('UTC');
$this->assertTrue($cron->isDue(new DateTime($date, $utc)));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam)));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo)));

date_default_timezone_set('Europe/Amsterdam');
$this->assertFalse($cron->isDue(new DateTime($date, $utc)));
$this->assertTrue($cron->isDue(new DateTime($date, $amsterdam)));
$this->assertFalse($cron->isDue(new DateTime($date, $tokyo)));

date_default_timezone_set('Asia/Tokyo');
$this->assertFalse($cron->isDue(new DateTime($date, $utc)));
$this->assertFalse($cron->isDue(new DateTime($date, $amsterdam)));
$this->assertTrue($cron->isDue(new DateTime($date, $tokyo)));
}

/**
Expand Down

0 comments on commit cbde1b5

Please sign in to comment.