MongoDB中的PHP时区偏移

MongoDB中的PHP时区偏移,php,datetime,mongodb,cron,Php,Datetime,Mongodb,Cron,我正在开发一个系统,使用MongoDB和PHP在单板上使用消息来祝愿生日 现在真正的问题是,当系统每天使用CRON作业生成消息,并检查是否有生日,如果有,然后在系统范围内发布。此外,每个用户都指定了自己的默认时区,并使用系统时间(当前为+5.30(IST))生成消息 所以,假设系统在12月3日上午12点生成了一条消息,存储在DB中的时间戳将与系统的时区一致。当用户访问的东西,它显示根据相同的,但我需要显示它根据用户的设置 请参阅附加的屏幕截图 一种方法是在设置日期和时间时使用服务器时间。目前,您

我正在开发一个系统,使用MongoDB和PHP在单板上使用消息来祝愿生日

现在真正的问题是,当系统每天使用CRON作业生成消息,并检查是否有生日,如果有,然后在系统范围内发布。此外,每个用户都指定了自己的默认时区,并使用系统时间(当前为+5.30(IST))生成消息

所以,假设系统在12月3日上午12点生成了一条消息,存储在DB中的时间戳将与系统的时区一致。当用户访问的东西,它显示根据相同的,但我需要显示它根据用户的设置


请参阅附加的屏幕截图

一种方法是在设置日期和时间时使用服务器时间。目前,您的设置似乎是由用户PC和服务器时间显示的。我认为只有使用AJAX才能实现这一点


仅设置和显示服务器时间,并为用户提供设置时区的选择。

您的服务器代码应使用UTC,因此您无需关心服务器的位置。使用本地时间可能会导致问题,因为某些时间点不存在,或者存在两次(DST跳跃)。但是,当您的服务器代码代表某个用户时,它必须遵守该用户的时区设置,因此您应该首先查找该设置。不过,这取决于您的具体要求

我建议你看看与时区相关的问题和解决方案。这是一个Java库,但可能有一个PHP等价物,或者您可以从它们的源代码中学习

现在,你的要求是:你需要确定你到底想要实现什么。一位来自洛杉矶的用户有一位朋友在澳大利亚。考虑到巨大的时差,你什么时候通知洛杉矶用户澳大利亚人的生日?2月29日出生的人该怎么办?如果LA用户目前在东京怎么办?我要说的是,在这个阶段让你的生活变得轻松,因为精确和及时的通知会让问题变得异常复杂

您可能需要在MongoDB中使用一个结构来存储生日,因为生日是一个重复发生的事件,而不是一个时间点。您可以将下一个通知时间存储为UTC,但并不是那么简单-请继续阅读

此外,还需要为每个用户存储时区。如果你需要精确性,这些时区也很烦人:它们的偏移量可能会改变,它们的DST规则也会改变(有时会在短时间内改变)。因此,只存储
时区ID
是有意义的。这就是为什么提前一年取消“下次通知时间”的规范化可能是一个挑战

您的确切需求将塑造代码和数据结构。我的建议是:将生日视为反复出现的、长期运行的当地时间事件。存储时区id和日期(没有时间!)。你的生日没有“附加”到一个时区,因为它没有意义-当你移动到另一个时区时,生日“跟随你”

在数据库中存储下一个通知日期和时间(UTC)是有意义的,因此通知查找代码很容易,但请记住,如果用户更改时区或用户政府突然决定引入DST规则,则必须更新这些代码


顺便说一句,cron应该比每天运行得更频繁,至少每小时一次。

但如何实现呢?假设用户的时区为+8.30,服务器的时区为+5.30,那么如果我在2011年12月3日晚上7:00做了一些事情,应该在2011年12月3日晚上10:00向用户显示。