根据用户情况处理PHP时区

根据用户情况处理PHP时区,php,mysql,datetime,Php,Mysql,Datetime,我知道这个问题可能会被问很多次,但我心里肯定没有什么疑问,顺便说一句,不要评论我所尝试的,我已经尝试了很多方法,但我只是问什么是正确的和更简单的方法,因为这里有很多帖子,对完成这些任务有不同的建议,所以我将explode()我的问题变成了小问题 所以,你们能不能告诉我,我的方向是对的还是错的,因为我确信很多人对日期/时间感到困惑 1) 为什么/如何使用PHP在MySQL中节省UTC时间? 就我个人而言,我使用php$year/$month/$day发布了这篇文章,并在mysql日期字段中使用ch

我知道这个问题可能会被问很多次,但我心里肯定没有什么疑问,顺便说一句,不要评论我所尝试的,我已经尝试了很多方法,但我只是问什么是正确的和更简单的方法,因为这里有很多帖子,对完成这些任务有不同的建议,所以我将
explode()
我的问题变成了小问题

所以,你们能不能告诉我,我的方向是对的还是错的,因为我确信很多人对日期/时间感到困惑

1) 为什么/如何使用PHP在MySQL中节省UTC时间? 就我个人而言,我使用php
$year/$month/$day
发布了这篇文章,并在mysql日期字段中使用
checkdate()
检查日期。那么这可以吗,或者我应该使用
时间戳
,然后使用php在前端分解检索到的字符串

2) 如果我从印度运行服务器,我应该使用
date\u default\u timezone\u set(“亚洲/加尔各答”)记录默认时间吗和,然后使用php函数减去和添加时间,或者在仅发布时,我应该检查从用户帐户中选择的用户时区,并相应地设置一个条件:

if(timezoneselected == +5.30) {
echo date_default_timezone_set("Asia/Calcutta");
} elseif(timezoneselected == +anytime) {
echo another country timezone
}
3) 最后一个问题是gmail、facebook等网站如何管理时间?我的意思是,如果他们根据自己的服务器保存datetime,而不是如何为每个用户显示完美的发布时间,即使是gmail,如果我向另一个用户发送邮件,我的发送时间和居住在另一个国家的人在打印的当地时间收到电子邮件,我的意思是我们如何做到这一点,对不起,我无法完美地解释你说的这个例子

facebook: 印度用户发帖,facebook显示8分钟前发布,9分钟前发布,在某个时间后显示真实日期,该日期根据我发布的时间是完美的,但是如果一个来自美国的人更新,在他的个人资料上说8分钟前9分钟前发布,但他的原始发布时间正确显示给他,甚至正确显示给我

很抱歉提出这个问题,但这确实有助于我理解这个日期/时间概念,也有助于未来的用户。谢谢大家!

如中所述:

当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括函数显示的值,如
NOW()
CURTIME()
,以及存储在
时间戳
列中并从中检索的值。
TIMESTAMP
列的值从当前时区转换为UTC进行存储,从UTC转换为当前时区进行检索


因此,如果您使用
时间戳
类型列,MySQL将自动为您处理时区转换:只需在其变量中为会话设置适当的时区。

底线是,您应该存储所有UTC

显示特定用户的时间时,请使用他们选择的时区。存储用户的时区,如“Asia/Calcutta”,并在使用
date\u default\u timezone\u set
方法显示时简单地转换时间

我将尝试从这里的评论中回答您的问题


你总是存储所有东西。这是基线。显示与基于用户转换的任何内容相关联的时间时。如果要显示8分钟前发布的,则需要获取当前UTC时间和与发布相关的UTC时间之间的差值。如果您从用户a(在印度)向用户B(在美国洛杉矶)发送消息,则您将以UTC存储消息时间。如果用户A正在查看,时间将转换为“亚洲/加尔各答”,如果用户B正在查看,时间将转换为“美国/洛杉矶”。使用UTC将使您的生活更加轻松。相信我。

我个人在表中单独处理d/m/y字段,这样我可以在将值获取到php时生成我想要的任何格式。它还帮助我进行简单的按查询排序。我只在需要与精确时间进行比较或需要计算时间(使用sql函数)时使用时间戳,比如选择5小时前的某个时间和类似的查询。好吧,那是我在问,我是否使用utc节省了所有时间,现在你是说,我应该给用户一个选项,让他们在从sql检索数据后选择时区和相应的+/-,对吗?如果我想向用户展示8分钟前发布的9个插件,几个小时后我会实时显示,这项任务也能完成吗?此外,如果一个用户向另一个时区不同的用户发送消息怎么办?php会平衡为两个用户设置的时区吗?如果两个用户互相发送消息,那么他们在不同时区的事实并不重要。任何存储的日期都存储在UTC中,因此只需将每个用户设置的日期\默认\时区\设置为他们自己的时区,并使用DateTime对象即可。例如:
$date=新的日期时间($theDateInUTC)$日期->格式('d/m/y h:i:s')。然后,无论谁查看该日期,都会看到它相对于自己的位置。谢谢兄弟,总之,我使用
gmdate()
,并根据用户为他设置的时区使用条件添加或减去偏移量。顺便说一句,我使用的是程序性的…现在我已经完全清楚了,我将使用
gmdate
在我的数据库中存储日期和时间,然后根据他/她的设置设置默认时区或向他显示默认时区:)顺便说一句,建议他/她设置时区,有点用他的ip知道他在哪里登录…?或者我应该让他自己选择时区?你可以使用各种方法。首先,你应该要求他们设置时区(因为这是最可靠的。)其次,你可以尝试使用他们的IP,或者你可以将一些东西与javascript组合在一起,如这里所述:很好,非常简单,我将存储
gmdate(“Y/m/dh:i:s”)
在sql中,然后在页面顶部设置默认时区,将utc转换为本地用户时间,非常简单,谢谢兄弟!