如何在移动服务器上处理PHP时区?

如何在移动服务器上处理PHP时区?,php,timezone,Php,Timezone,我一直收到关于使用strotime而未设置默认时区的常见PHP警告: PHP警告:date\u default\u timezone\u get():依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date\u default\u timezone\u set()函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,则很可能是您拼错了时区标识符。我们选择“美国/芝加哥”作为“CST/-6.0/无DST” 我读了很多关于需要做什么的内容,基本上似乎没有办法设置默认时区(

我一直收到关于使用strotime而未设置默认时区的常见PHP警告:

PHP警告:date\u default\u timezone\u get():依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date\u default\u timezone\u set()函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,则很可能是您拼错了时区标识符。我们选择“美国/芝加哥”作为“CST/-6.0/无DST”

我读了很多关于需要做什么的内容,基本上似乎没有办法设置默认时区(在php.ini中是date.timezone=“America/Chicago”,在php中是date\u default\u timezone\u set('CST6CDT')或类似的)

我的问题是,我们有一个移动服务器,经常会在不同的时区进行演示,所以我不能只设置一个固定的时区,让所有的东西都在我们去的地方工作

或者我可以吗?当然也有可能我完全误解了整个时区的概念;-)坦白地说,我读到的关于。。。我也不确定将服务器插入不同时区的网络会对服务器的系统时间产生怎样的影响-有太多我不知道或不理解的地方(对不起…)

我希望停止这些错误消息的主要原因是,由于这也是我的开发服务器,我必须大量筛选错误日志,并且必须过滤掉所有这些行是一个很大的痛苦

最重要的是,服务器上的应用程序不仅使用本地时间,而且还与静态服务器同步一些数据,因此我痛苦地意识到,我还必须调整许多主服务器代码,为此,我可以轻松地强制执行实际时区或UTC

那么这里最好的选择是什么

我应该简单地将UTC硬编码为默认时区,然后在我的数据库和用户界面中创建一个设置,我们可以使用该设置切换时区并更新所有代码以使用所有时区,还是有更好更简单的方法

或者我应该忽略整个问题,在每次使用strotime时都添加@?(为一场小小的暴乱做准备……;-)

期待任何建议。。。
谢谢

安迪·琼斯是对的。您最好的选择是完全基线化您的服务器。我的意思是将所有编码(bash、mysql)设置为UTF-8,时区设置为UTC。如果你从一开始就这样做,你将在今后的道路上避免很多头痛


关于您提出的问题,如果您将数据库中的所有时间戳存储为UTC,那么您只需要根据最终用户的时区进行转换。这避免了必须先确定存储在数据库中的时区是PST还是EST,然后再转换为用户的时区。此外,它还允许您在时区之间移动服务器。例如,如果您跨多个时区使用VPS,每个时区都会输入到同一个数据库中,那么您可以确保所有时区条目都是一致的。

您是否考虑过使用MySQL处理日期和使用时间戳列(它存储在UTC中并转换回当前时区)?Geeze,你们很快;-)不,我没有…事实上,我在MySQL中保存的大多数时间都是时间戳格式的,但是当我必须使用日期和strotime显示它们时,这对我没有多大帮助…好吧,这是有道理的,但我想我在我的问题中误解了一些东西。。。当我写“在我的数据库中创建一个设置”时,我的意思基本上是一个标志,告诉PHP将时间戳转换为哪个时区。我不想在每次交易中都保存时区。听起来你们都在说,为了保存和计算,我应该将所有内容默认为UTC。但是后来呢?然后我必须创建一个小界面来选择当前时区,保存该时区,并让我的所有代码使用该时区进行转换,同时仍然使用UTC作为基准-正确吗?是的,您是正确的。如果为用户提供GUI以选择时区,则可以将其存储在数据库中。当用户登录时,将时区设置为用户会话的一部分,然后每次显示日期时,将用户时区和日期传递给界面。另外,您可以将时区作为查询的一部分发布,并让MySQL为您执行:听起来这个项目需要做很多工作,但也需要做一些必要的工作。你的建议很有道理,非常感谢!我不能总是让MySQL做转换,因为我还有其他数据源,所以它将是PHP转换。我想PHP转换会自动检测DST,对吗?时区转换不需要额外扩展的最佳命令是什么?我已经在php.net上看到了strotime(“2013-02-25 14:00:00 CST”),那么在末尾添加时区会是一种方法吗?我使用php的DateTime API。不过要小心,如果传递一个unix时间戳,结果将假定为UTC,因此您必须额外调用
setTimezone
,如用户评论(由Joel发布)中所示。请查看:。如果您要传递日期时间字符串,您应该能够遵循“示例2”中发布的示例是的,这是正确的<代码>只有在显示时间时才是一种魔力,它可以防止你在路上拉扯头发。