2013-03-27 137 views
3

我完全难以理解插入的内容。基本上,我试图通过以UTC格式存储数据库中的所有内容,然后根据用户信息转换为本地时区来做正确的事情。我有很多查询工作得很好,但是这个插入查询正在向作品投掷扳手。MySQL时区混淆

$adt = date('Y-m-d') . " " . $_POST['Time']; 
echo $adt; 
$tmp_dt = new DateTime($adt, new DateTimeZone($tz)); 
echo $tmp_dt->format('H:i:s'); 
$tmp_dt->setTimezone(new DateTimeZone('UTC')); 
$UTC_time = $tmp_dt->format('H:i:s'); 
echo $UTC_time; 

echo 'date_default_timezone_set: ' . date_default_timezone_get() . '<br />'; 
mysql_select_db($db_name, $JewelryDB); 
mysql_query("SET time_zone = '+00:00';"); 

$updateSQL = sprintf("INSERT INTO reminder_cfg 
        (id, day_of, day_of_advance, day_prior, default_time, week_prior, 2_week_prior, 3_week_prior, 4_week_prior, 5_week_prior, day_after, 2_week_after, 50_day_after) 
        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) 
        ON DUPLICATE KEY UPDATE day_of = %s, day_of_advance = %s, day_prior = %s, default_time = %s, week_prior = %s, 2_week_prior = %s, 3_week_prior = %s, 4_week_prior = %s, 5_week_prior = %s, day_after = %s, 2_week_after = %s, 50_day_after = %s", 
        GetSQLValueString($jeweler, "text"), 
        GetSQLValueString($_POST['DayOf'], "text"), 
        GetSQLValueString($_POST['Advance'], "text"), 
        GetSQLValueString($_POST['DayPrior'], "text"), 
        GetSQLValueString($UTC_time, "text"), 
        GetSQLValueString($_POST['WeekPrior'], "text"), 
        GetSQLValueString($_POST['2WeeksPrior'], "text"), 
        GetSQLValueString($_POST['3WeeksPrior'], "text"), 
        GetSQLValueString($_POST['4WeeksPrior'], "text"), 
        GetSQLValueString($_POST['5WeeksPrior'], "text"), 
        GetSQLValueString($_POST['DayAfter'], "text"), 
        GetSQLValueString($_POST['2WeeksAfter'], "text"), 
        GetSQLValueString($_POST['50DaysAfter'], "text"), 
        GetSQLValueString($_POST['DayOf'], "text"), 
        GetSQLValueString($_POST['Advance'], "text"), 
        GetSQLValueString($_POST['DayPrior'], "text"), 
        GetSQLValueString($_POST['Time'], "text"), 
        GetSQLValueString($_POST['WeekPrior'], "text"), 
        GetSQLValueString($_POST['2WeeksPrior'], "text"), 
        GetSQLValueString($_POST['3WeeksPrior'], "text"), 
        GetSQLValueString($_POST['4WeeksPrior'], "text"), 
        GetSQLValueString($_POST['5WeeksPrior'], "text"), 
        GetSQLValueString($_POST['DayAfter'], "text"), 
        GetSQLValueString($_POST['2WeeksAfter'], "text"), 
        GetSQLValueString($_POST['50DaysAfter'], "text")); 

$Result1 = mysql_query($updateSQL, $JewelryDB) or die("Insert query error: " . mysql_error()); 

回声语句中的代码显示,我的时区转换工作正常,但插入语句不知何故减去5小时插入时间在本地时区。这是一个共享/托管服务器,所以我不能简单地将系统时间设置为UTC。我认为MySQL的“SET time_zone”会解决这个问题。

请帮忙。这让我疯狂。

+1

更好地存储在时间戳。 – 2013-03-27 12:18:18

+0

除了你的问题之外,从mysql_开始的PHP函数从PHP 5.5.0开始已被弃用。如果您有能力这样做,请考虑更新您的代码以改为使用MySQLi或PDO扩展。 – dnagirl 2013-03-27 12:21:50

+0

您可以使用'CONVERT_TZ'。 – fedorqui 2013-03-27 12:22:00

回答

0

Mysql区分timestamp数据类型和易混淆的类似datetime数据类型。 datetime类型具有隐式时区(由您根据窗口外的天气来定义),而存储在timestamp类型中的值则隐式转换为unixtime(UTC)。如果您希望保持时区转换不变,则应将值存储为datetime而不是timestamp