有关循环日历逻辑的实用、真实示例,请查看您的 PDA 或同等设备。
几年前,我在一个 Intranet 应用程序中构建了一个日历,并且基本上复制了我的 Palm 用于重复选项的内容。这对人们来说是有意义的,所以我认为它是成功的。但它并没有在数据库中存储真正的干净。我的代码最终进行了大量仔细检查,以确保数据与各种规则保持一致,以便在出现问题时进行纠正。这有助于我们在开发它时积极使用它。:-)
就存储而言,日历条目包含一个标志,指示它是否是循环系列的一部分。如果不是,则为非经常性条目。如果是,那么编辑它有几个选项,其中一个是在此条目处打破系列。经常性条目作为离散项目放入数据库;这是出于性能原因而进行的一种非规范化。除此之外,这意味着想要检查日历的其他代码不必担心重复项目。我们通过始终要求该系列的结束日期来解决“永无止境”的问题。
实际上,设置重复项目涉及 UI 中的一些 JavaScript 来控制不同的设置。数据库中的条目有一个值组合来指示重复范围(例如每天、每周……)、重复步骤(例如 1 周、2 周……)和任何变化(每周让你说“每周一、三、四”)。
最后,我们有一些我从未完全实现处理时区和夏令时的逻辑。这很困难,因为您必须允许有选择地应用班次。也就是说,一些日历项目将在最终用户本地保持时间,其他项目固定在一个位置,并且可能会或可能不会随着夏令时移动。我在解决这个问题之前离开了那家公司。
最后,我回复这个是因为我没有看到所有其他问题。:-) 但是去阅读并理解那个PDF。