public static function getTimeZoneId($userId = null, $date = null)
 {
     $dateKey = $date === null ? 0 : $date;
     $userIdKey = $userId === null ? 0 : $userId;
     if ($userId === null) {
         $userId = $GLOBALS["USER"]->GetId();
     }
     static $timezoneCache = array();
     if (isset($timezoneCache[$userIdKey]) && isset($timezoneCache[$userIdKey][$dateKey])) {
         return $timezoneCache[$userIdKey][$dateKey];
     }
     $autoTimeZone = $userZone = '';
     $factOffset = 0;
     if ($date === null) {
         $date = time();
     }
     static $userCache = array();
     if ($userId === null) {
         $autoTimeZone = trim($GLOBALS["USER"]->GetParam("AUTO_TIME_ZONE"));
         $userZone = $GLOBALS["USER"]->GetParam("TIME_ZONE");
     } else {
         if (!isset($userCache[$userId])) {
             $dbUser = CUser::GetByID($userId);
             if ($arUser = $dbUser->Fetch()) {
                 $userCache[$userId] = array("AUTO_TIME_ZONE" => trim($arUser["AUTO_TIME_ZONE"]), "TIME_ZONE" => $arUser["TIME_ZONE"], "TIME_ZONE_OFFSET" => $arUser["TIME_ZONE_OFFSET"]);
             }
         }
         if (isset($userCache[$userId])) {
             $autoTimeZone = $userCache[$userId]["AUTO_TIME_ZONE"];
             $userZone = $userCache[$userId]["TIME_ZONE"];
             $factOffset = $userCache[$userId]["TIME_ZONE_OFFSET"];
         }
     }
     if (CTimeZone::IsAutoTimeZone($autoTimeZone)) {
         static $userOffsetCache = array();
         if (!isset($userOffsetCache[$userId === null ? 0 : $userId])) {
             $userOffsetCache[$userIdKey] = CTimeZone::GetOffset($userId);
         }
         $userOffset = $userOffsetCache[$userIdKey];
         $localTime = new DateTime();
         $localOffset = $localTime->getOffset();
         $timezoneCache[$userIdKey][$dateKey] = CDavICalendarTimeZone::getTimezoneByOffset($date, $userOffset + $localOffset);
     } else {
         if ($userZone != '' && isset(self::$arTimeZones[$userZone])) {
             $timezoneCache[$userIdKey][$dateKey] = $userZone;
         } else {
             $localTime = new DateTime();
             $localOffset = $localTime->getOffset();
             $timezoneCache[$userIdKey][$dateKey] = CDavICalendarTimeZone::getTimezoneByOffset($date, $factOffset + $localOffset);
         }
     }
     return $timezoneCache[$userIdKey][$dateKey];
 }