Php Can';t在MySQL时间戳类型字段中插入日期会导致时区错误

Php Can';t在MySQL时间戳类型字段中插入日期会导致时区错误,php,mysql,date,datetime,timezone,Php,Mysql,Date,Datetime,Timezone,环境:Wordpress,XAMPP版本:7.2.10,PHP7.2,Windows10 我正在计算一个用户订阅过期日期(在今天的日期基础上增加90天),并将其存储在mysql数据库中。虽然php计算显示的日期在正确的时区,但MySQL表中存储的日期不正确+5小时。例如,“2019-10-29 14:55:01”应该是“2019-10-29 9:55:01”。(仅供参考-具有“更新当前时间戳”属性的其他时间戳字段正在更新到正确的时区。此外,Windows环境设置正确。) 我尝试了以下方法,但没有

环境:Wordpress,XAMPP版本:7.2.10,PHP7.2,Windows10

我正在计算一个用户订阅过期日期(在今天的日期基础上增加90天),并将其存储在mysql数据库中。虽然php计算显示的日期在正确的时区,但MySQL表中存储的日期不正确+5小时。例如,“2019-10-29 14:55:01”应该是“2019-10-29 9:55:01”。(仅供参考-具有“更新当前时间戳”属性的其他时间戳字段正在更新到正确的时区。此外,Windows环境设置正确。)

我尝试了以下方法,但没有成功:

  • 在我的php代码中设置默认时区
  • 将以下内容添加到my.htaccess:php_value date.timezone“America/Chicago”
  • php_value date.timezone“美国/芝加哥”
  • 将其添加到php.ini:date.timezone=America/Chicago
(每次更改后重新启动Xampp。)

我的PHP代码:

$start_date = date("Y-m-d H:i:s");  //  Today's date in timestamp format.
$default_subscription_period = get_option('apr2s_user_subscription_period' );  // For now, 90 days
$user_subscription_expire_date = calculate_user_subscription_expire_date($start_date, $default_subscription_period);

echo "Start Date is  : ".$start_date."<br>";   //  Shows correct date & time in correct timezone
echo "Expire Date is : ".$user_subscription_expire_date."<br>";  //  Shows correct date & time in correct timezone

$results1 = $wpdb->insert($user_table_name, array(
"user_subscription_expire_date" => $user_subscription_expire_date,));

function calculate_user_subscription_expire_date($start_date, $subscription_period_in_days){
    date_default_timezone_set('America/Chicago');
    $expire_date = date('Y-m-d H:i:s', strtotime($start_date. ' + '.$subscription_period_in_days.'days'));
    return ($expire_date);
}
$start_date=date(“Y-m-d H:i:s”);//以时间戳格式显示今天的日期。
$default_subscription_period=get_选项('apr2s_user_subscription_period');//现在,90天
$user\u subscription\u expire\u date=计算\u user\u subscription\u expire\u date($start\u date,$default\u subscription\u period);
echo“开始日期为:.”$Start_Date.“
”;//在正确的时区显示正确的日期和时间 echo“过期日期为:“.$user_subscription_Expire_Date”。
”;//在正确的时区显示正确的日期和时间 $results1=$wpdb->insert($user\u table\u name,数组)( “用户订阅过期日期”=>$user订阅过期日期,); 函数计算用户订阅过期日期($start\u date,$subscription\u period\u in\u days){ 日期默认时区设置(“美国/芝加哥”); $expire\u date=date('Y-m-d H:i:s',strottime('start\u date.'+'。$subscription\u period\u in_days.'days'); 返回($expire_date); }

想法?塔克斯

为了简单起见,您应该将所有内容存储在UTC中。也要在UTC中执行所有计算。仅当向用户显示时才转换为正确的时区,并使用
DateTime()
class而不是
date\u default\u timezone\u set
。在PHP和MySQL中,最好将默认时区设置为UTC

您可以完全避免使用PHP进行日期计算,而使用SQL函数

INSERT INTO $user_table_name (user_subscription_expire_date) 
    VALUES (DATE_ADD(NOW(), INTERVAL 90 DAY))
或在wordpress中动态:

$wpdb->query( $wpdb->prepare("INSERT INTO $user_table_name (user_subscription_expire_date) 
        VALUES (DATE_ADD(NOW(), INTERVAL %d DAY))", 
    $default_subscription_period
) );
当您想向用户显示时,只需使用:

$date = new \DateTime($dateFromDB);
$date->setTimezone(new \DateTimeZone('America/Chicago'));

您不需要PHP来完成这项工作。SQL也有日期函数。两次投票失败的原因是什么?MySQL将所有内容都存储在UTC中。您应该仅在向用户显示时转换为时区。Dharman-则phpmyadmin在显示时也可能转换为我的时区。虽然我看到了存储的值。谢谢。警告:不要用于介绍数据。相反,使用带有占位符值的WordPress。