You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

预调度Zoom会议时间不符问题及修复方案求助

问题描述

调用Zoom API创建的预调度会议时间与预期不符。支付成功后,通过payment-successful.php传递用户选择的日期(12-12-2022)和时间(16:00)给api.php的createMeeting函数创建会议,但返回的会议开始时间为2022-12-13T01:00:00Z,而非预期的2022-12-12T16:00:00Z,Zoom客户端显示时间为2022-12-13 02:00AM。已尝试调整api.php中的时区设置,但未解决问题,怀疑是时区处理或gmdate函数使用不当导致。

相关代码

payment-successful.php代码

$newDate = date("Y-m-d", strtotime($apoDate));
$newTime = " " . $apoTime . ":00";

$startTime = date($apoDate . $apoTime);
function password_generate($chars) 
{
  $data = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz';
  return substr(str_shuffle($data), 0, $chars);
}

include('config.php');
include('api.php');
$arr['topic']='meinegutebewerbung.de meeting' . password_generate(1);
$arr['start_date']=$startTime;
$arr['duration']=45;
$arr['password']=password_generate(7);
$arr['type']='2';
$result=createMeeting($arr);
if(isset($result->id)){
    echo "Join URL: <a href='".$result->join_url."'>".$result->join_url."</a><br/>";
    echo "Password: ".$result->password."<br/>";
    echo "Start Time: ".$result->start_time."<br/>";
    echo "Duration: ".$result->duration."<br/>";
}else{
    echo '<pre>';
    print_r($result);
}

api.php的createMeeting函数代码

function createMeeting($data = array())
{
    $post_time = $data['start_date'];
    $start_time = gmdate("Y-m-d\TH:i:s", strtotime($post_time));

    $createMeetingArr = array();
    if (!empty($data['alternative_host_ids']))
    {
        if (count($data['alternative_host_ids']) > 1)
        {
            $alternative_host_ids = implode(",", $data['alternative_host_ids']);
        }
        else
        {
            $alternative_host_ids = $data['alternative_host_ids'][0];
        }
    }

    $createMeetingArr['topic'] = $data['topic'];
    $createMeetingArr['agenda'] = !empty($data['agenda']) ? $data['agenda'] : "";
    $createMeetingArr['type'] = !empty($data['type']) ? $data['type'] : 2; //Scheduled
    $createMeetingArr['start_time'] = $start_time;
    $createMeetingArr['timezone'] = 'Europe/Sarajevo ';
    $createMeetingArr['password'] = !empty($data['password']) ? $data['password'] : "";
    $createMeetingArr['duration'] = !empty($data['duration']) ? $data['duration'] : 60;

    $createMeetingArr['settings'] = array(
        'join_before_host' => !empty($data['join_before_host']) ? true : false,
        'host_video' => !empty($data['option_host_video']) ? true : false,
        'participant_video' => !empty($data['option_participants_video']) ? true : false,
        'mute_upon_entry' => !empty($data['option_mute_participants']) ? true : false,
        'enforce_login' => !empty($data['option_enforce_login']) ? true : false,
        'auto_recording' => !empty($data['option_auto_recording']) ? $data['option_auto_recording'] : "none",
        'alternative_hosts' => isset($alternative_host_ids) ? $alternative_host_ids : ""
    );

    $request_url = "https://api.zoom.us/v2/users/" . EMAIL_ID . "/meetings";
    $token = array(
        "iss" => API_KEY,
        "exp" => time() + 3600 //60 seconds as suggested
        
    );
    $getJWTKey = JWT::encode($token, API_SECRET);
    $headers = array(
        "authorization: Bearer " . $getJWTKey,
        "content-type: application/json",
        "Accept: application/json",
    );

    $fieldsArr = json_encode($createMeetingArr);

    $ch = curl_init();
    curl_setopt_array($ch, array(
        CURLOPT_URL => $request_url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => $fieldsArr,
        CURLOPT_HTTPHEADER => $headers,
    ));

    $result = curl_exec($ch);
    $err = curl_error($ch);
    curl_close($ch);
    if (!$result)
    {
        return $err;
    }
    return json_decode($result);
}

依赖:使用php-jwt库

解决方案

问题根源

  1. payment-successful.php中$startTime生成逻辑错误:
    代码中$startTime = date($apoDate . $apoTime);完全误用了date()函数,第一个参数应为格式字符串,而非日期时间拼接后的字符串,这会导致解析出错误的时间戳。
  2. 时区处理混乱:
    api.php中设置的timezone参数末尾有多余空格,且使用gmdate转换时间时,原始时间戳本身已错误,同时未正确考虑Europe/Sarajevo时区的UTC偏移(冬季UTC+1,夏季UTC+2)。

修复步骤

1. 修复payment-successful.php的时间生成逻辑

替换错误的$startTime生成代码,确保生成正确的本地时区时间字符串:

// 拼接用户选择的日期与时间,指定时区解析
$dateTime = new DateTime($apoDate . " " . $apoTime, new DateTimeZone('Europe/Sarajevo'));
$startTime = $dateTime->format('Y-m-d H:i:s');

如果PHP环境默认时区已设为Europe/Sarajevo,可简化为:

$startTime = date('Y-m-d H:i:s', strtotime($apoDate . " " . $apoTime));

2. 调整api.php的时间转换逻辑

Zoom API要求start_time为UTC格式,需正确将本地时区时间转换为UTC:

$post_time = $data['start_date'];
// 用指定时区解析传入的本地时间
$localDateTime = new DateTime($post_time, new DateTimeZone('Europe/Sarajevo'));
// 转换为UTC时间并符合API要求的格式
$start_time = $localDateTime->setTimezone(new DateTimeZone('UTC'))->format('Y-m-d\TH:i:s\Z');

同时移除timezone参数末尾的空格:

$createMeetingArr['timezone'] = 'Europe/Sarajevo';

3. 统一PHP环境时区

在项目入口文件(如config.php)添加时区设置,避免全局解析错误:

date_default_timezone_set('Europe/Sarajevo');

验证结果

修复后,用户选择的12-12-2022 16:00(Europe/Sarajevo时区)会被转换为UTC时间2022-12-12T15:00:00Z,Zoom客户端将根据用户本地时区显示正确的会议时间,API返回的start_time也会符合预期。

内容的提问来源于stack exchange,提问作者smack857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:55:16