Date

How do I convert timestamps between UTC (GMT) and an arbitrary timezone in PHP?

These function work on PHP 4 and 5.

/** Converts a timestamp between arbitrary timezones. */
function tz_to_tz($timestamp,$from_tz,$to_tz) {
  $old_tz = getenv('TZ');
  // Parse $timestamp and extract the Unix time.
  if(!empty($from_tz))
      putenv("TZ=$from_tz");
  $unix_time = strtotime($timestamp);
  // Unix time is seconds since the epoch (in UTC).

  // Express the Unix time as a string for timezone $tz.
  putenv("TZ=$to_tz");
  $result = strftime("%Y-%m-%d %H:%M %Z",$unix_time);
  putenv("TZ=$old_tz");
  return $result;
}

/** Converts a timestamp with timezone information into
 *  an arbitrary timezone. */
function to_tz($timestamp_with_timezone,$to_tz) {
  // Set $from_tz to blank, so that $timestamp_with_timezone
  // is parsed to determine timezone.
  return tz_to_tz($timestamp_with_timezone,'',$to_tz);
}

/** Converts a timestamp with timezone information into UTC. */
function to_utc($timestamp_with_timezone) {
  return to_tz($timestamp_with_timezone,'UTC');
}

Examples

British winter time is the same as UTC.

tz_to_tz("2006-12-01 12:00","Europe/London","UTC")
      --> 2006-12-01 12:00 UTC

British summer time is UTC+0100.

tz_to_tz("2006-08-01 12:00","Europe/London","UTC")
      --> 2006-08-01 11:00 UTC

There is a cleaner way to do this in PHP 5, using date_default_timezone_set() and date_default_timezone_get() instead of setting the TZ environment variable. I'm sticking to this for the time-being though, since most people who use my stuff still seem to be on PHP 4.

These functions are hereby released into the public domain.