Example #1
0
	/**
	 * 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;
	}