MongoDB中的PHP时区偏移量

时间:2011-12-03 11:03:54

标签: php datetime mongodb cron

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

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

因此,假设系统在12月3日上午12点生成了一条消息,存储在DB中的时间戳将按照系统的时区进行。当用户访问它显示的东西时,我需要根据用户的设置显示它。

请参阅随附的屏幕截图。 Datetime Problem

2 个答案:

答案 0 :(得分:1)

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

我建议您查看Joda Time有关时区的问题和解决方案。它是一个Java库,但也许有一个PHP等价物,或者你可以从它们的来源中学习。

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

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

此外,您需要为每个用户存储时区。如果你需要精确度,那些时区也会很烦人:他们的偏移量会发生变化,他们的DST规则会发生变化(有时会在短时间内发生变化)。因此,仅存储TimezoneId是有意义的。这就是为什么提前一年对“下一个通知时间”进行非正规化可能是一个挑战。

您的确切要求将塑造代码和数据结构。我的建议是:将生日视为经常性,长期运行的本地时间事件。存储时区ID和日期(没有时间!)。您的生日没有“附加”到时区,因为它没有意义 - 当您移动到其他时区时,生日'跟随您'。

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

作为旁注,你的cron应该比每天更频繁地运行,至少每小时一次。

答案 1 :(得分:0)

一种方法是在设置日期和时间时使用服务器时间。目前它似乎是由用户PC设置并由服务器时间显示。我假设只有AJAX才能实现?

仅设置和显示服务器时间,并允许用户选择设置时区。