我有submitted this previously但因为某人拒绝投票并表示已经回答,否则没有人会回答。
我知道这里有类似的帖子:
但他们没有回答我的请求,这是一个实用,简单和真实的重复日历设置逻辑示例,而不使用除PHP和MySQL之外的其他框架或工具/脚本。
我同意这篇文章http://martinfowler.com/apsupp/recurring.pdf很好,但它太抽象了,我无法理解。
我知道还有其他“系统已经做到了这一点”,但这是我自己的白鲸,我会在某个时候弄明白 - 我会在路上给予一些帮助。
所以,问题是:如何使用PHP和MySQL构建定期日历?
答案 0 :(得分:1)
您应该努力了解福勒的文章。它确实涵盖了它。
事实是,这是一个难题。 “动态”编辑逻辑并不是用户真正想做的事情。相反,他们希望你作为程序员预测他们想要做的事情并提供一个规则 - 例如,他们不想弄清楚如何计算当月的第二个星期三。 / p>
听起来你真正的问题在于对MySQL中的重现进行建模。您可以使用Google's spec,它可以存储在数据库中并在之前覆盖Stack Overflow。 Fowler的文章还提供了一些良好的起点,可以在RDBMS中表示明确定义的类。
这是一个难题。虽然SO希望你成功,但我们只能带你到流。我们不能强迫你喝酒。
答案 1 :(得分:0)
有关重复日历逻辑的实际实际示例,请查看您的PDA或同等信息。
几年前我在内联网应用程序中构建了一个日历,基本上复制了我的Palm用于重复选项的内容。它对人们有意义,所以我认为它是成功的。但它没有在数据库中存储真正的清洁。我的代码最后进行了大量细致的检查,数据是否一致以及各种规则,以便在出现问题时纠正错误。它帮助我们在开发它时积极地使用它。 :-)
就存储而言,日历条目包含一个标志,表明它是否是重复序列的一部分。如果不是,那就是一个非经常性的条目。如果是,那么编辑它有几个选项,其中一个是打破这个条目的系列。重复的条目作为离散项目放入数据库;这是一种因性能原因而完成的非规范化。除此之外,它意味着其他想要检查日历的代码不必担心重复出现的项目。我们总是要求系列的结束日期解决了“无休止”的问题。
实际设置定期项目涉及UI中的一些JavaScript来控制不同的设置。数据库中的条目具有值的组合,以指示重复的范围(例如,每天,每周......)经常性步骤(例如,1周,2周,......)和任何变化(每周让你说“每周一,周三,周四”。
最后,我们有一些逻辑,我从来没有完全实现处理时区和夏令时。这很困难,因为您必须允许轮班有选择地应用。也就是说,一些日历项目将保持在最终用户本地的时间,其他日历项目被固定到一个位置,并且可能或可能不会随着夏令时而变化。在我解决这个问题之前,我离开了那家公司。
最后,我回答这个问题,因为我没有看到所有其他问题。 :-)但是请阅读并理解PDF。