【问题标题】:MySQL timezone confusionMySQL时区混淆
【发布时间】:2013-03-27 12:12:42
【问题描述】:

我完全不知道插入到底是怎么回事。基本上,我试图做正确的事情,将数据库中的所有内容以 UTC 存储,然后根据用户的信息转换为本地时区。我有很多查询都可以正常工作,但是这个插入查询正在给工作带来麻烦。

$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 语句显示我的时区转换按预期工作,但插入语句以某种方式减去 5 小时以将时间插入本地时区。这是一个共享/托管服务器,所以我不能简单地将系统时间设置为 UTC。我认为 MySQL "SET time_zone" 会纠正这个问题。

请帮忙。这让我发疯了。

【问题讨论】:

  • 最好存储在时间戳中。
  • 顺便问一下,以 mysql_ 开头的 PHP 函数自 PHP 5.5.0 起已被弃用。如果您有能力这样做,请考虑更新您的代码以改用 MySQLi 或 PDO 扩展。
  • 你可以使用CONVERT_TZ
  • @SureshKamrushi:存储为 Unix 时间戳会交换一组问题。您失去了 DATETIME SQL 数据类型和相关函数的所有灵活性和数据类型强制规则;你仅限于 Unix 时代;您仍然必须确保存储的是 UTC 值而不是本地值。
  • 首先...感谢有关 MYSQLi 的警告,我希望能够在不久的将来转换所有内容。现在,我正在尝试解决一些主要错误,然后再进行研究。

标签: php mysql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2012-05-15
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多