"taking into account timezone of iso8601 date in bocal::date2ts(), eg. used in time-range filters in CalDAV"

This commit is contained in:
Ralf Becker 2008-06-04 13:22:11 +00:00
parent 4144775ef1
commit e2f749c86b

View File

@ -1052,19 +1052,28 @@ class bocal
{ {
$date_in = $date; $date_in = $date;
switch(gettype($date)) switch(gettype($date))
{ {
case 'string': // YYYYMMDD or iso8601 YYYY-MM-DDThh:mm:ss string case 'string': // YYYYMMDD or iso8601 YYYY-MM-DDThh:mm:ss[Z|[+-]hh:mm] string
if (is_numeric($date) && $date > 21000000) if (is_numeric($date) && $date > 21000000)
{ {
$date = (int) $date; // this is already as timestamp $date = (int) $date; // this is already as timestamp
break; break;
} }
// ToDo: evaluate evtl. added timezone // evaluate evtl. added timezone
if (strlen($date) > 12)
{
if (substr($date,-1) == 'Z')
{
$time_offset = date('Z');
}
elseif(preg_match('/([+-]{1})([0-9]{2}):?([0-9]{2})$/',$date,$matches))
{
$time_offset = date('Z')-($matches[1] == '+' ? 1 : -1)*(3600*$matches[2]+60*$matches[3]);
}
}
// removing all non-nummerical chars, gives YYYYMMDDhhmmss, independent of the iso8601 format // removing all non-nummerical chars, gives YYYYMMDDhhmmss, independent of the iso8601 format
$date = str_replace(array('-',':','T','Z',' '),'',$date); $date = str_replace(array('-',':','T','Z',' ','+'),'',$date);
$date = array( $date = array(
'year' => (int) substr($date,0,4), 'year' => (int) substr($date,0,4),
'month' => (int) substr($date,4,2), 'month' => (int) substr($date,4,2),
@ -1095,6 +1104,11 @@ class bocal
$date = $this->now_su; $date = $this->now_su;
break; break;
} }
if ($time_offset)
{
$date += $time_offset;
if (!$user2server) $date += $this->tz_offset_s; // we have to return user time!
}
if ($user2server) if ($user2server)
{ {
$date -= $this->tz_offset_s; $date -= $this->tz_offset_s;