3

インサートで何が起こっているのか、私は完全に困惑しています。基本的に、データベースにすべてを UTC で保存し、ユーザーの情報に基づいてローカル タイムゾーンに変換することで、正しいことをしようとしています。正常に動作しているクエリが多数ありますが、この 1 つの挿入クエリが問題を引き起こしています。

$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());

コード内の echo ステートメントは、私のタイムゾーン変換が期待どおりに機能していることを示していますが、insert ステートメントはローカル タイムゾーンに時刻を挿入するために何らかの方法で 5 時間を減算しています。これは共有/ホスト サーバーであるため、単純にシステム時刻を UTC に設定することはできません。MySQLの「SET time_zone」がこれを修正すると思いました。

助けてください。これは私を夢中にさせています。

4

1 に答える 1

0

timestampMysql は、データ型と紛らわしい類似のデータ型を区別しdatetimeます。このdatetime型には暗黙的なタイム ゾーン (窓の外の天気に応じてユーザーが定義) があり、timestamp型に格納されている値は暗黙的に unixtime (UTC) に変換されます。タイムゾーンの変換を維持したい場合は、値をdatetimeではなくとして保存する必要がありますtimestamp

于 2013-04-04T10:50:35.013 に答える