/** * Returns a Piwik_Date objects. * * @param string $strDate 'today' 'yesterday' or any YYYY-MM-DD or timestamp * @param string $timezone if specified, the dateString will be relative to this $timezone. * For example, today in UTC+12 will be a timestamp in the future for UTC. * This is different from using ->setTimezone() * @return Piwik_Date */ static public function factory($dateString, $timezone = null) { if($dateString instanceof self) { $dateString = $dateString->toString(); } if($dateString == 'now') { $date = self::now(); } elseif($dateString == 'today') { $date = self::today(); } elseif($dateString == 'yesterday') { $date = self::yesterday(); } elseif($dateString == 'yesterdaySameTime') { $date = self::yesterdaySameTime(); } elseif (!is_int($dateString) && ( // strtotime returns the timestamp for April 1st for a date like 2011-04-01,today // but we don't want this, as this is a date range and supposed to throw the exception strpos($dateString, ',') !== false || ($dateString = strtotime($dateString)) === false )) { throw new Exception(Piwik_TranslateException('General_ExceptionInvalidDateFormat', array("YYYY-MM-DD, or 'today' or 'yesterday'", "strtotime", "http://php.net/strtotime"))); } else { $date = new Piwik_Date($dateString); } if(empty($timezone)) { return $date; } // manually adjust for UTC timezones $utcOffset = self::extractUtcOffset($timezone); if($utcOffset !== false) { return $date->addHour($utcOffset); } date_default_timezone_set($timezone); $datetime = $date->getDatetime(); date_default_timezone_set('UTC'); $date = Piwik_Date::factory(strtotime($datetime)); return $date; }