【问题标题】:How to change mySQL NOW() so it will fit another timezone?如何更改 mySQL NOW() 使其适合另一个时区?
【发布时间】:2017-03-23 17:48:20
【问题描述】:

我有以下问题: 我正在使用几年前为我制作的朋友提供的 php/mysql 脚本。通常情况下,我会在我所在国家/地区的服务器上托管该脚本,因此服务器时间将是我的当地时间(欧洲/柏林),所以根本没有问题。

但现在我在美国(纽约)托管了我的域,并且我的脚本将错误的时间添加到数据库中(当前为 -5 小时)。

所以不是添加 2017-03-23 19:00 而是添加 2017-03-23 14:00

所以我的解决方案是更改 mySQL 查询并减去 5 小时,它会适合......现在......但是在夏季/冬季变化时,我将不得不再次调整脚本 :(

所以我的问题是: 如何更改我的 NOW() 以适应我的时区(欧洲/柏林)?

这是我的一个问题,所以你可以帮我编辑它,因为我是一个完全的菜鸟,需要我们的帮助,非常感谢!

$insQuery = "INSERT INTO tbl_anmeldungen (fld_raid_id,fld_user_id,fld_anmelddate,fld_anmelde_notiz,fld_random) VALUES ('$raidID','$userID',NOW(),'$notiz','$myrand')";

所有需要更改/编辑的是 NOW() 部分,以将其修复到我的时区。如果这不可能,我需要如何更改 NOW() 部分以减少 5 小时?

非常感谢您的帮助!谢谢!

【问题讨论】:

  • 警告:尽可能使用prepared statements来避免在查询中注入任意数据并创建SQL injection bugs。在mysqliPDO 中执行这些操作非常简单,其中任何用户提供的数据都使用?:name 指示符指定,稍后使用bind_paramexecute 填充,具体取决于您是哪个使用。
  • 嗨,tadman,也许它不安全或不是最新的,我知道,代码已经写了 12 年,而且不是我编写的(我什至不能编写代码)。所以请尝试帮助我解决我的问题,因为我什至没有足够的技能来修复或使其更安全,抱歉:(
  • 使用CONVERT_TZ()函数。
  • 顺便说一句:在有人可能会回答之前:“为什么不将服务器时间更改为本地时区”?我不能,因为它是共享网络空间,而不是 VPN 或专用服务器 :(
  • @Barmar:我想这是个好主意。但是由于我是一个完全的菜鸟并且没有制作该脚本,您能否使用我上面的代码向我展示使用 CONVERT_TZ() 的效果?那么: VALUES ('$raidID','$userID',NOW(),'$notiz','$myrand') 会怎样?谢谢!

标签: mysql datetime timezone


【解决方案1】:

我从另一个用户那里找到了一些其他“想法”:

打开与 MySQL 的连接后,运行以下查询: SET time_zone = 时区; 然后,您执行的所有功能都将为该连接在该时区运行(即,直到您关闭到数据库的“链接”。

所以有人可以告诉我以下是否可行?

$conn = mysql_connect($dbhostname,$dbusername,$dbpassword) or die ("db 下..."); mysql_select_db($dbname);

SET time_zone = "欧洲/柏林";

那么我所有的 NOW() 都会使用我的时区,对吗? 请参阅以下链接: https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

【讨论】:

    【解决方案2】:

    我要感谢用户 Barmar!

    他没有准确或详细地帮助我,但他让我走上了正确的道路;)我现在已经“解决”了我的问题:

    CONVERT_TZ(NOW(),'+00:00','+5:00')

    现在 mysql 在我的数据库中输入正确的时间(为服务器时间增加了 +5 小时,即纽约,以适应我的时区,即欧洲/柏林)

    而且它有效! ...但是:

    这只会在夏季/冬季发生一些变化之前有效。然后我将不得不修复我的所有代码并使其再次适应 +4 或 +6 小时。

    所以这只是一个半专业的fid。如果有人知道“按名称”实施正确时区的更好方法,以便夏季/冬季时间变化将自动调整,我会非常高兴!

    【讨论】:

    • 夏季/冬季问题是为什么您应该使用命名时区,例如 US/EasternEurope/Berlin。这些将根据夏令时自动调整。
    • 是的,我明白了,但是 CONVERT_TZ(NOW(),'US/Eastern','Europe/Berlin') 将无法正常工作,因为我刚刚尝试过。我知道如果我会使用 CONVERT_TZ(fld_anmelddate, 'US/Eastern', 'Europe/Berlin') 但我想在正确的时区转换它之前(!)它被写入数据库。你知道我怎么能做到这一点吗?谢谢!
    • 如果它不适用于命名区域,请参阅stackoverflow.com/questions/14454304/convert-tz-returns-null/…
    • 是的,结果为空。因此,如果可以将信息加载到 sql 中导致其共享网络空间,我必须与我的主机商交谈。但如果他们这样做,它应该工作吗?
    • 是的,我想是的。
    猜你喜欢
    • 2012-05-30
    • 2012-02-28
    • 2011-11-08
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多